blob: 6cb4395498f103ba327ba96884e8b7816b925d23 [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"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070085 "void main() {\n"
86 " vertices[0] = vec2(-1.0, -1.0);\n"
87 " vertices[1] = vec2( 1.0, -1.0);\n"
88 " vertices[2] = vec2( 0.0, 1.0);\n"
89 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
90 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050091
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070092static const char bindStateFragShaderText[] =
93 "#version 450\n"
94 "\n"
95 "layout(location = 0) out vec4 uFragColor;\n"
96 "void main(){\n"
97 " uFragColor = vec4(0,1,0,1);\n"
98 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050099
Dave Houlton1d2022c2017-03-29 11:43:58 -0600100// Format search helper
101VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600102 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 -0600103 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
104 VkFormatProperties format_props;
105 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
106
107 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
108 return ds_formats[i];
109 }
110 }
111 return (VkFormat)0;
112}
113
114// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600115static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
116 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
117 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600118
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119// ErrorMonitor Usage:
120//
Dave Houltonfbf52152017-01-06 12:55:29 -0700121// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600122// encountered log messages, or a validation error enum identifying
123// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
124// will match all log messages. logMsg will return true for skipCall
125// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126//
Dave Houltonfbf52152017-01-06 12:55:29 -0700127// Call VerifyFound to determine if all desired failure messages
128// were encountered. Call VerifyNotFound to determine if any unexpected
129// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600130class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700131 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700132 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700133 test_platform_thread_create_mutex(&mutex_);
134 test_platform_thread_lock_mutex(&mutex_);
135 Reset();
136 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600137 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600138
Dave Houltonfbf52152017-01-06 12:55:29 -0700139 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600140
Dave Houltonfbf52152017-01-06 12:55:29 -0700141 // Set monitor to pristine state
142 void Reset() {
143 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
144 bailout_ = NULL;
145 message_found_ = VK_FALSE;
146 failure_message_strings_.clear();
147 desired_message_strings_.clear();
148 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700149 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700150 other_messages_.clear();
151 message_outstanding_count_ = 0;
152 }
153
154 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700155 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700156 test_platform_thread_lock_mutex(&mutex_);
157 desired_message_strings_.insert(msgString);
158 message_flags_ |= msgFlags;
159 message_outstanding_count_++;
160 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600161 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700163 // ErrorMonitor will look for an error message containing the specified string(s)
164 template <typename Iter>
165 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
166 for (; iter != end; ++iter) {
167 SetDesiredFailureMsg(msgFlags, *iter);
168 }
169 }
170
Dave Houltonfbf52152017-01-06 12:55:29 -0700171 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700172 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700173 test_platform_thread_lock_mutex(&mutex_);
174 desired_message_ids_.insert(msg_id);
175 message_flags_ |= msgFlags;
176 message_outstanding_count_++;
177 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600178 }
179
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700180 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
181 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
182 // function and its definition.
183 void SetUnexpectedError(const char *const msg) {
184 test_platform_thread_lock_mutex(&mutex_);
185
186 ignore_message_strings_.emplace_back(msg);
187
188 test_platform_thread_unlock_mutex(&mutex_);
189 }
190
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700191 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600192 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700193 test_platform_thread_lock_mutex(&mutex_);
194 if (bailout_ != NULL) {
195 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600196 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600197 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600198 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600199
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 if (!IgnoreMessage(errorString)) {
201 for (auto desired_msg : desired_message_strings_) {
202 if (desired_msg.length() == 0) {
203 // An empty desired_msg string "" indicates a positive test - not expecting an error.
204 // Return true to avoid calling layers/driver with this error.
205 // And don't erase the "" string, so it remains if another error is found.
206 result = VK_TRUE;
207 found_expected = true;
208 message_found_ = VK_TRUE;
209 failure_message_strings_.insert(errorString);
210 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600211 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700212 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700213 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700214 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700215 result = VK_TRUE;
216 // We only want one match for each expected error so remove from set here
217 // Since we're about the break the loop it's ok to remove from set we're iterating over
218 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600219 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600220 }
221 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700222 for (auto desired_id : desired_message_ids_) {
223 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
224 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
225 // Return true to avoid calling layers/driver with this error.
226 result = VK_TRUE;
227 } else if (desired_id == message_code) {
228 // Double-check that the string matches the error enum
229 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
230 found_expected = true;
231 message_outstanding_count_--;
232 result = VK_TRUE;
233 message_found_ = VK_TRUE;
234 desired_message_ids_.erase(desired_id);
235 break;
236 } else {
237 // Treat this message as a regular unexpected error, but print a warning jic
238 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
239 errorString.c_str(), desired_id, validation_error_map[desired_id]);
240 }
241 }
242 }
243
244 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600245 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700246 other_messages_.push_back(errorString);
247 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600248 }
249
Dave Houltonfbf52152017-01-06 12:55:29 -0700250 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600251 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600252 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600253
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600254 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
255
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700256 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600257
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700258 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600259
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700260 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700261
262 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600263
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600264 void DumpFailureMsgs(void) const {
265 vector<string> otherMsgs = GetOtherFailureMsgs();
266 if (otherMsgs.size()) {
267 cout << "Other error messages logged for this test were:" << endl;
268 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
269 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600270 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600271 }
272 }
273
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600274 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200275
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600276 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700277 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600278 // Match ANY message matching specified type
279 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700280 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200281 }
282
283 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600284 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700285 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600286 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700287 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700288 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600289 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600292 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700294 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200295 }
296
297 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600298 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700299 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600300 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700301 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700302 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600303 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200304 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700305 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200306 }
307
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700308 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700309 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
310 // function and its definition.
311 bool IgnoreMessage(std::string const &msg) const {
312 if (ignore_message_strings_.empty()) {
313 return false;
314 }
315
316 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
317 return msg.find(str) != std::string::npos;
318 }) != ignore_message_strings_.end();
319 }
320
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700321 VkFlags message_flags_;
322 std::unordered_set<uint32_t> desired_message_ids_;
323 std::unordered_set<string> desired_message_strings_;
324 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700325 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700326 vector<string> other_messages_;
327 test_platform_thread_mutex mutex_;
328 bool *bailout_;
329 VkBool32 message_found_;
330 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600331};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500332
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600333static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
334 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
335 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600336 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
337 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600338#ifdef _DEBUG
339 char embedded_code_string[2048];
340 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
341 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
342#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600343 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600344#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600345 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600346 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600347}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500348
Karl Schultz6addd812016-02-02 17:17:23 -0700349class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700350 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600351 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
352 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700353 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
355 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700356 }
Tony Barbour300a6082015-04-07 13:44:53 -0600357
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600358 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
359 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700360 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700362 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600363 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700364 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600365 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
366 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
367 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700368 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
369 }
370 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
371 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
372 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600373 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
375 InitState(features, flags);
376 }
377
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700378 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700379 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600380 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600381 std::vector<const char *> instance_layer_names;
382 std::vector<const char *> instance_extension_names;
383 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600384
385 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700386 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600387 /*
388 * Since CreateDbgMsgCallback is an instance level extension call
389 * any extension / layer that utilizes that feature also needs
390 * to be enabled at create instance time.
391 */
Karl Schultz6addd812016-02-02 17:17:23 -0700392 // Use Threading layer first to protect others from
393 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700394 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600395 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800396 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700397 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700399 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600400
Ian Elliott2c1daf52016-05-12 09:41:46 -0600401 if (m_enableWSI) {
402 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
403 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
404#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
405#if defined(VK_USE_PLATFORM_ANDROID_KHR)
406 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700407#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600408#if defined(VK_USE_PLATFORM_MIR_KHR)
409 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
412 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WIN32_KHR)
415 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WIN32_KHR
417#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600418#if defined(VK_USE_PLATFORM_XCB_KHR)
419 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
420#elif defined(VK_USE_PLATFORM_XLIB_KHR)
421 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700422#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423 }
424
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600425 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600426 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800427 this->app_info.pApplicationName = "layer_tests";
428 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pEngineName = "unittest";
430 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600431 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600432
Tony Barbour15524c32015-04-29 17:34:29 -0600433 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600434 }
435
436 virtual void TearDown() {
437 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600438 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600439 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600440 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600441
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600443};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 // Create identity matrix
447 int i;
448 struct vktriangle_vs_uniform data;
449
450 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700451 glm::mat4 View = glm::mat4(1.0f);
452 glm::mat4 Model = glm::mat4(1.0f);
453 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700455 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 memcpy(&data.mvp, &MVP[0][0], matrixSize);
458
Karl Schultz6addd812016-02-02 17:17:23 -0700459 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600460 {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 -0500461 };
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 data.position[i][0] = tri_data[i].posX;
465 data.position[i][1] = tri_data[i].posY;
466 data.position[i][2] = tri_data[i].posZ;
467 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700468 data.color[i][0] = tri_data[i].r;
469 data.color[i][1] = tri_data[i].g;
470 data.color[i][2] = tri_data[i].b;
471 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500472 }
473
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 ASSERT_NO_FATAL_FAILURE(InitViewport());
475
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200476 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
477 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
Karl Schultz6addd812016-02-02 17:17:23 -0700479 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600480 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
482 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800483 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484 pipelineobj.AddShader(&vs);
485 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600486 if (failMask & BsoFailLineWidth) {
487 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600488 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600489 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600490 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
491 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600492 }
493 if (failMask & BsoFailDepthBias) {
494 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600495 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600496 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600497 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600498 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600499 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600500 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700501 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700502 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 if (failMask & BsoFailViewport) {
504 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
505 }
506 if (failMask & BsoFailScissor) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
508 }
509 if (failMask & BsoFailBlend) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600511 VkPipelineColorBlendAttachmentState att_state = {};
512 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
513 att_state.blendEnable = VK_TRUE;
514 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600515 }
516 if (failMask & BsoFailDepthBounds) {
517 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
518 }
519 if (failMask & BsoFailStencilReadMask) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
521 }
522 if (failMask & BsoFailStencilWriteMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
524 }
525 if (failMask & BsoFailStencilReference) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
527 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
529 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600530 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700533 m_commandBuffer->BeginCommandBuffer();
534 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500535
Tony Barbourfe3351b2015-07-28 10:17:20 -0600536 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537
538 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600539 if (failMask & BsoFailIndexBuffer) {
540 // Use DrawIndexed w/o an index buffer bound
541 DrawIndexed(3, 1, 0, 0, 0);
542 } else {
543 Draw(3, 1, 0, 0);
544 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545
Mark Muellerd4914412016-06-13 17:52:06 -0600546 if (failMask & BsoFailCmdClearAttachments) {
547 VkClearAttachment color_attachment = {};
548 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700549 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600550 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
551
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600552 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600553 }
554
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500555 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700556 m_commandBuffer->EndRenderPass();
557 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600558 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500559}
560
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
562 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500563 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500565 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600566 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500567 }
568
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800569 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700570 // Make sure depthWriteEnable is set so that Depth fail test will work
571 // correctly
572 // Make sure stencilTestEnable is set so that Stencil fail test will work
573 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600574 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800575 stencil.failOp = VK_STENCIL_OP_KEEP;
576 stencil.passOp = VK_STENCIL_OP_KEEP;
577 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
578 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600579
580 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
581 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600582 ds_ci.pNext = NULL;
583 ds_ci.depthTestEnable = VK_FALSE;
584 ds_ci.depthWriteEnable = VK_TRUE;
585 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
586 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600587 if (failMask & BsoFailDepthBounds) {
588 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600589 ds_ci.maxDepthBounds = 0.0f;
590 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600591 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600592 ds_ci.stencilTestEnable = VK_TRUE;
593 ds_ci.front = stencil;
594 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600595
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600596 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600597 pipelineobj.SetViewport(m_viewports);
598 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600600 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600601 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 commandBuffer->BindPipeline(pipelineobj);
603 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500604}
605
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600606class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700607 public:
608 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609};
610
Ian Elliott2c1daf52016-05-12 09:41:46 -0600611class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700612 public:
613 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600614 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600615};
616
Mark Muellerdfe37552016-07-07 14:47:42 -0600617class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700618 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600619 enum eTestEnFlags {
620 eDoubleDelete,
621 eInvalidDeviceOffset,
622 eInvalidMemoryOffset,
623 eBindNullBuffer,
624 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600625 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600626 };
627
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600628 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600629
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
631 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 return true;
633 }
634 VkDeviceSize offset_limit = 0;
635 if (eInvalidMemoryOffset == aTestFlag) {
636 VkBuffer vulkanBuffer;
637 VkBufferCreateInfo buffer_create_info = {};
638 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
639 buffer_create_info.size = 32;
640 buffer_create_info.usage = aBufferUsage;
641
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600643 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
647 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
649 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600650 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600652 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600653 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600654 }
655 if (eOffsetAlignment < offset_limit) {
656 return true;
657 }
658 return false;
659 }
660
661 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600662 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
663 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600664 if (eBindNullBuffer == aTestFlag) {
665 VulkanMemory = 0;
666 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
667 } else {
668 VkBufferCreateInfo buffer_create_info = {};
669 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
670 buffer_create_info.size = 32;
671 buffer_create_info.usage = aBufferUsage;
672
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600673 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600674
675 CreateCurrent = true;
676
677 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600678 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600679
680 VkMemoryAllocateInfo memory_allocate_info = {};
681 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800682 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600683 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
684 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600685 if (!pass) {
686 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
687 return;
688 }
689
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600690 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600691 AllocateCurrent = true;
692 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
694 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600695 BoundCurrent = true;
696
697 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
698 }
699 }
700
701 ~VkBufferTest() {
702 if (CreateCurrent) {
703 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
704 }
705 if (AllocateCurrent) {
706 if (InvalidDeleteEn) {
707 union {
708 VkDeviceMemory device_memory;
709 unsigned long long index_access;
710 } bad_index;
711
712 bad_index.device_memory = VulkanMemory;
713 bad_index.index_access++;
714
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600715 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600716 }
717 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
718 }
719 }
720
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600721 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600722
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600723 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600724
725 void TestDoubleDestroy() {
726 // Destroy the buffer but leave the flag set, which will cause
727 // the buffer to be destroyed again in the destructor.
728 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
729 }
730
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700731 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 bool AllocateCurrent;
733 bool BoundCurrent;
734 bool CreateCurrent;
735 bool InvalidDeleteEn;
736
737 VkBuffer VulkanBuffer;
738 VkDevice VulkanDevice;
739 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600740};
741
742class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700743 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600744 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600745 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 : BoundCurrent(false),
747 AttributeCount(aAttributeCount),
748 BindingCount(aBindingCount),
749 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600750 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600751 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
752 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700753 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
756 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
759 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
760 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
761 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
762 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600763
764 unsigned i = 0;
765 do {
766 VertexInputAttributeDescription[i].binding = BindId;
767 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600768 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
769 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600770 i++;
771 } while (AttributeCount < i);
772
773 i = 0;
774 do {
775 VertexInputBindingDescription[i].binding = BindId;
776 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600777 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600778 i++;
779 } while (BindingCount < i);
780 }
781
782 ~VkVerticesObj() {
783 if (VertexInputAttributeDescription) {
784 delete[] VertexInputAttributeDescription;
785 }
786 if (VertexInputBindingDescription) {
787 delete[] VertexInputBindingDescription;
788 }
789 }
790
791 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600792 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
793 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600794 return true;
795 }
796
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600797 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600798 VkDeviceSize *offsetList;
799 unsigned offsetCount;
800
801 if (aOffsetCount) {
802 offsetList = aOffsetList;
803 offsetCount = aOffsetCount;
804 } else {
805 offsetList = new VkDeviceSize[1]();
806 offsetCount = 1;
807 }
808
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600809 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600810 BoundCurrent = true;
811
812 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600813 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600814 }
815 }
816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700817 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600818 static uint32_t BindIdGenerator;
819
820 bool BoundCurrent;
821 unsigned AttributeCount;
822 unsigned BindingCount;
823 uint32_t BindId;
824
825 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
826 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
827 VkVertexInputBindingDescription *VertexInputBindingDescription;
828 VkConstantBufferObj VulkanMemoryBuffer;
829};
830
831uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500832// ********************************************************************************************************************
833// ********************************************************************************************************************
834// ********************************************************************************************************************
835// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600836TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700837 TEST_DESCRIPTION(
838 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
839 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840
Tony Barbour1fa09702017-03-16 12:09:08 -0600841 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600842
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600844 // Specify NULL for a pointer to a handle
845 // Expected to trigger an error with
846 // parameter_validation::validate_required_pointer
847 vkGetPhysicalDeviceFeatures(gpu(), NULL);
848 m_errorMonitor->VerifyFound();
849
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
851 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600852 // Specify NULL for pointer to array count
853 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600854 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 m_errorMonitor->VerifyFound();
856
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 // Specify 0 for a required array count
859 // Expected to trigger an error with parameter_validation::validate_array
860 VkViewport view_port = {};
861 m_commandBuffer->SetViewport(0, 0, &view_port);
862 m_errorMonitor->VerifyFound();
863
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600865 // Specify NULL for a required array
866 // Expected to trigger an error with parameter_validation::validate_array
867 m_commandBuffer->SetViewport(0, 1, NULL);
868 m_errorMonitor->VerifyFound();
869
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
878 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600879 // Specify VK_NULL_HANDLE for a required handle array entry
880 // Expected to trigger an error with
881 // parameter_validation::validate_required_handle_array
882 VkFence fence = VK_NULL_HANDLE;
883 vkResetFences(device(), 1, &fence);
884 m_errorMonitor->VerifyFound();
885
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600887 // Specify NULL for a required struct pointer
888 // Expected to trigger an error with
889 // parameter_validation::validate_struct_type
890 VkDeviceMemory memory = VK_NULL_HANDLE;
891 vkAllocateMemory(device(), NULL, NULL, &memory);
892 m_errorMonitor->VerifyFound();
893
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600895 // Specify 0 for a required VkFlags parameter
896 // Expected to trigger an error with parameter_validation::validate_flags
897 m_commandBuffer->SetStencilReference(0, 0);
898 m_errorMonitor->VerifyFound();
899
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600900 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 -0600901 // Specify 0 for a required VkFlags array entry
902 // Expected to trigger an error with
903 // parameter_validation::validate_flags_array
904 VkSemaphore semaphore = VK_NULL_HANDLE;
905 VkPipelineStageFlags stageFlags = 0;
906 VkSubmitInfo submitInfo = {};
907 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
908 submitInfo.waitSemaphoreCount = 1;
909 submitInfo.pWaitSemaphores = &semaphore;
910 submitInfo.pWaitDstStageMask = &stageFlags;
911 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
912 m_errorMonitor->VerifyFound();
913}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914
Dustin Gravesfce74c02016-05-10 11:42:58 -0600915TEST_F(VkLayerTest, ReservedParameter) {
916 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
917
Tony Barbour1fa09702017-03-16 12:09:08 -0600918 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600919
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921 // Specify 0 for a reserved VkFlags parameter
922 // Expected to trigger an error with
923 // parameter_validation::validate_reserved_flags
924 VkEvent event_handle = VK_NULL_HANDLE;
925 VkEventCreateInfo event_info = {};
926 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
927 event_info.flags = 1;
928 vkCreateEvent(device(), &event_info, NULL, &event_handle);
929 m_errorMonitor->VerifyFound();
930}
931
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700933 TEST_DESCRIPTION(
934 "Specify an invalid VkStructureType for a Vulkan "
935 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600936
Tony Barbour1fa09702017-03-16 12:09:08 -0600937 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600938
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600940 // Zero struct memory, effectively setting sType to
941 // VK_STRUCTURE_TYPE_APPLICATION_INFO
942 // Expected to trigger an error with
943 // parameter_validation::validate_struct_type
944 VkMemoryAllocateInfo alloc_info = {};
945 VkDeviceMemory memory = VK_NULL_HANDLE;
946 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
947 m_errorMonitor->VerifyFound();
948
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600950 // Zero struct memory, effectively setting sType to
951 // VK_STRUCTURE_TYPE_APPLICATION_INFO
952 // Expected to trigger an error with
953 // parameter_validation::validate_struct_type_array
954 VkSubmitInfo submit_info = {};
955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
956 m_errorMonitor->VerifyFound();
957}
958
959TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600961
Tony Barbour1fa09702017-03-16 12:09:08 -0600962 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600963
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600965 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600966 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600967 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600968 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600969 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600970 // Zero-initialization will provide the correct sType
971 VkApplicationInfo app_info = {};
972 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
973 event_alloc_info.pNext = &app_info;
974 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
975 m_errorMonitor->VerifyFound();
976
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
978 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600979 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
980 // a function that has allowed pNext structure types and specify
981 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600982 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600983 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600984 VkMemoryAllocateInfo memory_alloc_info = {};
985 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
986 memory_alloc_info.pNext = &app_info;
987 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600988 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600989}
Dustin Graves5d33d532016-05-09 16:21:12 -0600990
Chris Forbes93c08962017-05-19 11:25:59 -0700991TEST_F(VkLayerTest, UnrecognizedValueOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -0600992 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
995 "does not fall within the begin..end "
996 "range of the core VkFormat "
997 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 // Specify an invalid VkFormat value
999 // Expected to trigger an error with
1000 // parameter_validation::validate_ranged_enum
1001 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 m_errorMonitor->VerifyFound();
Chris Forbes93c08962017-05-19 11:25:59 -07001004}
1005
1006TEST_F(VkLayerTest, UnrecognizedValueBadMask) {
1007 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -06001008
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001009 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 -06001010 // Specify an invalid VkFlags bitmask value
1011 // Expected to trigger an error with parameter_validation::validate_flags
1012 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001013 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1014 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001015 m_errorMonitor->VerifyFound();
Chris Forbes93c08962017-05-19 11:25:59 -07001016}
1017
1018TEST_F(VkLayerTest, UnrecognizedValueBadFlag) {
1019 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -06001020
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001021 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 -06001022 // Specify an invalid VkFlags array entry
1023 // Expected to trigger an error with
1024 // parameter_validation::validate_flags_array
1025 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001026 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001027 VkSubmitInfo submit_info = {};
1028 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1029 submit_info.waitSemaphoreCount = 1;
1030 submit_info.pWaitSemaphores = &semaphore;
1031 submit_info.pWaitDstStageMask = &stage_flags;
1032 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1033 m_errorMonitor->VerifyFound();
Chris Forbes93c08962017-05-19 11:25:59 -07001034}
1035
1036TEST_F(VkLayerTest, UnrecognizedValueBadBool) {
1037 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -06001038
Cort Strattonedbe9b82017-05-16 07:38:35 -07001039 // Sneak in a test to make sure using VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
1040 // doesn't trigger a false positive.
1041 uint32_t extension_count = 0;
1042 bool supports_mirror_clamp = false;
1043 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
1044 ASSERT_VK_SUCCESS(err);
1045 if (extension_count > 0) {
1046 std::vector<VkExtensionProperties> available_extensions(extension_count);
1047
1048 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
1049 ASSERT_VK_SUCCESS(err);
1050 for (const auto &extension_props : available_extensions) {
1051 if (strcmp(extension_props.extensionName, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME) == 0) {
1052 supports_mirror_clamp = true;
1053 }
1054 }
1055 }
1056 VkSamplerAddressMode address_mode = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
1057 if (!supports_mirror_clamp) {
1058 printf(" mirror_clamp_to_edge Extension not supported, skipping tests\n");
1059 address_mode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
Cort Strattonedbe9b82017-05-16 07:38:35 -07001060 }
1061
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001063 // Specify an invalid VkBool32 value
1064 // Expected to trigger a warning with
1065 // parameter_validation::validate_bool32
1066 VkSampler sampler = VK_NULL_HANDLE;
1067 VkSamplerCreateInfo sampler_info = {};
1068 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1069 sampler_info.pNext = NULL;
1070 sampler_info.magFilter = VK_FILTER_NEAREST;
1071 sampler_info.minFilter = VK_FILTER_NEAREST;
1072 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
Cort Strattonedbe9b82017-05-16 07:38:35 -07001073 sampler_info.addressModeU = address_mode;
1074 sampler_info.addressModeV = address_mode;
1075 sampler_info.addressModeW = address_mode;
Dustin Graves5d33d532016-05-09 16:21:12 -06001076 sampler_info.mipLodBias = 1.0;
1077 sampler_info.maxAnisotropy = 1;
1078 sampler_info.compareEnable = VK_FALSE;
1079 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1080 sampler_info.minLod = 1.0;
1081 sampler_info.maxLod = 1.0;
1082 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1083 sampler_info.unnormalizedCoordinates = VK_FALSE;
1084 // Not VK_TRUE or VK_FALSE
1085 sampler_info.anisotropyEnable = 3;
1086 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1087 m_errorMonitor->VerifyFound();
Chris Forbes93c08962017-05-19 11:25:59 -07001088}
1089
1090#if 0
1091TEST_F(VkLayerTest, UnrecognizedValueMaxEnum) {
1092 ASSERT_NO_FATAL_FAILURE(Init());
Cort Strattonedbe9b82017-05-16 07:38:35 -07001093
1094 // Specify MAX_ENUM
1095 VkDescriptorSetLayoutBinding binding = {};
1096 binding.binding = 0;
1097 binding.descriptorType = VK_DESCRIPTOR_TYPE_MAX_ENUM;
1098 binding.descriptorCount = 1;
1099 binding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1100 VkDescriptorSetLayoutCreateInfo layout_ci = {};
1101 layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1102 layout_ci.bindingCount = 1;
1103 layout_ci.pBindings = &binding;
1104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end range");
1105 VkDescriptorSetLayout layout = VK_NULL_HANDLE;
1106 vkCreateDescriptorSetLayout(device(), &layout_ci, NULL, &layout);
1107 m_errorMonitor->VerifyFound();
1108 if (layout != VK_NULL_HANDLE) {
1109 vkDestroyDescriptorSetLayout(device(), layout, NULL);
1110 }
Dustin Graves5d33d532016-05-09 16:21:12 -06001111}
Chris Forbes93c08962017-05-19 11:25:59 -07001112#endif
Dustin Gravesfce74c02016-05-10 11:42:58 -06001113
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114TEST_F(VkLayerTest, UpdateBufferAlignment) {
1115 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001116 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001117
Tony Barbour1fa09702017-03-16 12:09:08 -06001118 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119
1120 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1121 vk_testing::Buffer buffer;
1122 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001127 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1128 m_errorMonitor->VerifyFound();
1129
1130 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001132 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1133 m_errorMonitor->VerifyFound();
1134
1135 // Introduce failure by using dataSize that is < 0
1136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001137 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001138 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1139 m_errorMonitor->VerifyFound();
1140
1141 // Introduce failure by using dataSize that is > 65536
1142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001143 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001144 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1145 m_errorMonitor->VerifyFound();
1146
Tony Barbour552f6c02016-12-21 14:34:07 -07001147 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001148}
1149
1150TEST_F(VkLayerTest, FillBufferAlignment) {
1151 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1152
Tony Barbour1fa09702017-03-16 12:09:08 -06001153 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154
1155 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1156 vk_testing::Buffer buffer;
1157 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1158
Tony Barbour552f6c02016-12-21 14:34:07 -07001159 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001160
1161 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001163 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1164 m_errorMonitor->VerifyFound();
1165
1166 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001168 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1169 m_errorMonitor->VerifyFound();
1170
1171 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001173 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1174 m_errorMonitor->VerifyFound();
1175
Tony Barbour552f6c02016-12-21 14:34:07 -07001176 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001177}
Dustin Graves40f35822016-06-23 11:12:53 -06001178
Cortd889ff92016-07-27 09:51:27 -07001179TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1180 VkResult err;
1181
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001182 TEST_DESCRIPTION(
1183 "Attempt to use a non-solid polygon fill mode in a "
1184 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001185
Tony Barbour1fa09702017-03-16 12:09:08 -06001186 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1188
1189 std::vector<const char *> device_extension_names;
1190 auto features = m_device->phy().features();
1191 // Artificially disable support for non-solid fill modes
Chris Forbes05054022017-05-17 16:29:06 -07001192 features.fillModeNonSolid = VK_FALSE;
Cortd889ff92016-07-27 09:51:27 -07001193 // The sacrificial device object
1194 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1195
1196 VkRenderpassObj render_pass(&test_device);
1197
1198 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1199 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1200 pipeline_layout_ci.setLayoutCount = 0;
1201 pipeline_layout_ci.pSetLayouts = NULL;
1202
1203 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001204 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001205 ASSERT_VK_SUCCESS(err);
1206
1207 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1208 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1209 rs_ci.pNext = nullptr;
1210 rs_ci.lineWidth = 1.0f;
Chris Forbes05054022017-05-17 16:29:06 -07001211 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Cortd889ff92016-07-27 09:51:27 -07001212
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001213 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1214 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001215
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001216 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1218 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001219 {
1220 VkPipelineObj pipe(&test_device);
1221 pipe.AddShader(&vs);
1222 pipe.AddShader(&fs);
1223 pipe.AddColorAttachment();
1224 // Introduce failure by setting unsupported polygon mode
1225 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1226 pipe.SetRasterization(&rs_ci);
1227 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1228 }
1229 m_errorMonitor->VerifyFound();
1230
1231 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1233 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001234 {
1235 VkPipelineObj pipe(&test_device);
1236 pipe.AddShader(&vs);
1237 pipe.AddShader(&fs);
1238 pipe.AddColorAttachment();
1239 // Introduce failure by setting unsupported polygon mode
1240 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1241 pipe.SetRasterization(&rs_ci);
1242 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1243 }
1244 m_errorMonitor->VerifyFound();
1245
Cortd889ff92016-07-27 09:51:27 -07001246 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1247}
1248
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001249#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001261
1262 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1263 vk_testing::Buffer buffer;
1264 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001267 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001268 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269
1270 testFence.init(*m_device, fenceInfo);
1271
1272 // Bypass framework since it does the waits automatically
1273 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001274 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001275 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1276 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001277 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001278 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001279 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001281 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001282 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001283 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001284
1285 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001286 ASSERT_VK_SUCCESS( err );
1287
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001289 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001290
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001291 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001292}
1293
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001294TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001295{
1296 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001297 VkFenceCreateInfo fenceInfo = {};
1298 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1299 fenceInfo.pNext = NULL;
1300 fenceInfo.flags = 0;
1301
Mike Weiblencce7ec72016-10-17 19:33:05 -06001302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001303
Tony Barbour1fa09702017-03-16 12:09:08 -06001304 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_NO_FATAL_FAILURE(InitViewport());
1306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1307
Tony Barbourfe3351b2015-07-28 10:17:20 -06001308 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001309 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001310 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001311
1312 testFence.init(*m_device, fenceInfo);
1313
1314 // Bypass framework since it does the waits automatically
1315 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001316 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1318 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001319 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001320 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001321 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001322 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001323 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001324 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001325 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001326
1327 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001328 ASSERT_VK_SUCCESS( err );
1329
Jon Ashburnf19916e2016-01-11 13:12:43 -07001330 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001331 VkCommandBufferBeginInfo info = {};
1332 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1333 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001334 info.renderPass = VK_NULL_HANDLE;
1335 info.subpass = 0;
1336 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001337 info.occlusionQueryEnable = VK_FALSE;
1338 info.queryFlags = 0;
1339 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001340
1341 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001342 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001344 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001345}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001346#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001347
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001348TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1349 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1350
Tony Barbour1fa09702017-03-16 12:09:08 -06001351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001352
1353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1354 VkBuffer buffer;
1355 VkBufferCreateInfo buf_info = {};
1356 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1357 buf_info.pNext = NULL;
1358 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1359 buf_info.size = 2048;
1360 buf_info.queueFamilyIndexCount = 0;
1361 buf_info.pQueueFamilyIndices = NULL;
1362 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1364 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1365 m_errorMonitor->VerifyFound();
1366
1367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1368 VkImage image;
1369 VkImageCreateInfo image_create_info = {};
1370 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1371 image_create_info.pNext = NULL;
1372 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1373 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1374 image_create_info.extent.width = 512;
1375 image_create_info.extent.height = 64;
1376 image_create_info.extent.depth = 1;
1377 image_create_info.mipLevels = 1;
1378 image_create_info.arrayLayers = 1;
1379 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1380 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1381 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1382 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1383 image_create_info.queueFamilyIndexCount = 0;
1384 image_create_info.pQueueFamilyIndices = NULL;
1385 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1386 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1387 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1388 m_errorMonitor->VerifyFound();
1389}
1390
Dave Houlton829c0d82017-01-24 15:09:17 -07001391TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1392 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1393
1394 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001395 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001396 ASSERT_NO_FATAL_FAILURE(
1397 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001398 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001399
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001400 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001401 device_features.sparseResidencyImage2D = VK_FALSE;
1402 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001403 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001404
1405 VkImage image = VK_NULL_HANDLE;
1406 VkResult result = VK_RESULT_MAX_ENUM;
1407 VkImageCreateInfo image_create_info = {};
1408 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1409 image_create_info.pNext = NULL;
1410 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1411 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1412 image_create_info.extent.width = 512;
1413 image_create_info.extent.height = 1;
1414 image_create_info.extent.depth = 1;
1415 image_create_info.mipLevels = 1;
1416 image_create_info.arrayLayers = 1;
1417 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1418 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1419 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1420 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1421 image_create_info.queueFamilyIndexCount = 0;
1422 image_create_info.pQueueFamilyIndices = NULL;
1423 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1424 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1425
1426 // 1D image w/ sparse residency is an error
1427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1428 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1429 m_errorMonitor->VerifyFound();
1430 if (VK_SUCCESS == result) {
1431 vkDestroyImage(m_device->device(), image, NULL);
1432 image = VK_NULL_HANDLE;
1433 }
1434
1435 // 2D image w/ sparse residency when feature isn't available
1436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1437 image_create_info.extent.height = 64;
1438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1439 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1440 m_errorMonitor->VerifyFound();
1441 if (VK_SUCCESS == result) {
1442 vkDestroyImage(m_device->device(), image, NULL);
1443 image = VK_NULL_HANDLE;
1444 }
1445
1446 // 3D image w/ sparse residency when feature isn't available
1447 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1448 image_create_info.extent.depth = 8;
1449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1450 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1451 m_errorMonitor->VerifyFound();
1452 if (VK_SUCCESS == result) {
1453 vkDestroyImage(m_device->device(), image, NULL);
1454 image = VK_NULL_HANDLE;
1455 }
1456}
1457
1458TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1459 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1460
1461 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001462 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001463 ASSERT_NO_FATAL_FAILURE(
1464 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001465 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001466
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001467 // These tests require that the device support sparse residency for 2D images
1468 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1469 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001470 return;
1471 }
1472
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001473 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001474 device_features.sparseResidency2Samples = VK_FALSE;
1475 device_features.sparseResidency4Samples = VK_FALSE;
1476 device_features.sparseResidency8Samples = VK_FALSE;
1477 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001478 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001479
1480 VkImage image = VK_NULL_HANDLE;
1481 VkResult result = VK_RESULT_MAX_ENUM;
1482 VkImageCreateInfo image_create_info = {};
1483 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1484 image_create_info.pNext = NULL;
1485 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1486 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1487 image_create_info.extent.width = 64;
1488 image_create_info.extent.height = 64;
1489 image_create_info.extent.depth = 1;
1490 image_create_info.mipLevels = 1;
1491 image_create_info.arrayLayers = 1;
1492 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1493 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1494 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1495 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1496 image_create_info.queueFamilyIndexCount = 0;
1497 image_create_info.pQueueFamilyIndices = NULL;
1498 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1499 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1500
1501 // 2D image w/ sparse residency and linear tiling is an error
1502 m_errorMonitor->SetDesiredFailureMsg(
1503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1504 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1505 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1506 m_errorMonitor->VerifyFound();
1507 if (VK_SUCCESS == result) {
1508 vkDestroyImage(m_device->device(), image, NULL);
1509 image = VK_NULL_HANDLE;
1510 }
1511 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1512
1513 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1514 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1516 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1517 m_errorMonitor->VerifyFound();
1518 if (VK_SUCCESS == result) {
1519 vkDestroyImage(m_device->device(), image, NULL);
1520 image = VK_NULL_HANDLE;
1521 }
1522
1523 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1525 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1526 m_errorMonitor->VerifyFound();
1527 if (VK_SUCCESS == result) {
1528 vkDestroyImage(m_device->device(), image, NULL);
1529 image = VK_NULL_HANDLE;
1530 }
1531
1532 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1534 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1535 m_errorMonitor->VerifyFound();
1536 if (VK_SUCCESS == result) {
1537 vkDestroyImage(m_device->device(), image, NULL);
1538 image = VK_NULL_HANDLE;
1539 }
1540
1541 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1543 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1544 m_errorMonitor->VerifyFound();
1545 if (VK_SUCCESS == result) {
1546 vkDestroyImage(m_device->device(), image, NULL);
1547 image = VK_NULL_HANDLE;
1548 }
1549}
1550
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001552 TEST_DESCRIPTION(
1553 "Create a buffer and image, allocate memory, and bind the "
1554 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001555 VkResult err;
1556 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001557 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001558
Tobin Ehlis077ded32016-05-12 17:39:13 -06001559 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001561 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001562 VkDeviceMemory mem; // buffer will be bound first
1563 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001564 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001565 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566
1567 VkBufferCreateInfo buf_info = {};
1568 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1569 buf_info.pNext = NULL;
1570 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1571 buf_info.size = 256;
1572 buf_info.queueFamilyIndexCount = 0;
1573 buf_info.pQueueFamilyIndices = NULL;
1574 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1575 buf_info.flags = 0;
1576 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1577 ASSERT_VK_SUCCESS(err);
1578
Tobin Ehlis077ded32016-05-12 17:39:13 -06001579 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001580
1581 VkImageCreateInfo image_create_info = {};
1582 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1583 image_create_info.pNext = NULL;
1584 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1585 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1586 image_create_info.extent.width = 64;
1587 image_create_info.extent.height = 64;
1588 image_create_info.extent.depth = 1;
1589 image_create_info.mipLevels = 1;
1590 image_create_info.arrayLayers = 1;
1591 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001592 // Image tiling must be optimal to trigger error when aliasing linear buffer
1593 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001594 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1595 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1596 image_create_info.queueFamilyIndexCount = 0;
1597 image_create_info.pQueueFamilyIndices = NULL;
1598 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1599 image_create_info.flags = 0;
1600
Tobin Ehlisf11be982016-05-11 13:52:53 -06001601 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1602 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001603 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1604 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001605
Tobin Ehlis077ded32016-05-12 17:39:13 -06001606 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1607
1608 VkMemoryAllocateInfo alloc_info = {};
1609 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1610 alloc_info.pNext = NULL;
1611 alloc_info.memoryTypeIndex = 0;
1612 // Ensure memory is big enough for both bindings
1613 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001614 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1615 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001616 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001617 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001619 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001620 return;
1621 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001622 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1623 ASSERT_VK_SUCCESS(err);
1624 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1625 ASSERT_VK_SUCCESS(err);
1626
Rene Lindsayd14f5572016-12-16 14:57:18 -07001627 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1628
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001630 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001631 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1632 m_errorMonitor->VerifyFound();
1633
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001634 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001635 // aliasing buffer2
1636 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1637 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001638 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1639 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001640 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001641 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001643 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001644 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001645 m_errorMonitor->VerifyFound();
1646
1647 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001648 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001649 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001650 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001651 vkFreeMemory(m_device->device(), mem, NULL);
1652 vkFreeMemory(m_device->device(), mem_img, NULL);
1653}
1654
Tobin Ehlis35372522016-05-12 08:32:31 -06001655TEST_F(VkLayerTest, InvalidMemoryMapping) {
1656 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1657 VkResult err;
1658 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001659 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001660
1661 VkBuffer buffer;
1662 VkDeviceMemory mem;
1663 VkMemoryRequirements mem_reqs;
1664
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001665 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1666
Tobin Ehlis35372522016-05-12 08:32:31 -06001667 VkBufferCreateInfo buf_info = {};
1668 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1669 buf_info.pNext = NULL;
1670 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1671 buf_info.size = 256;
1672 buf_info.queueFamilyIndexCount = 0;
1673 buf_info.pQueueFamilyIndices = NULL;
1674 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1675 buf_info.flags = 0;
1676 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1677 ASSERT_VK_SUCCESS(err);
1678
1679 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1680 VkMemoryAllocateInfo alloc_info = {};
1681 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1682 alloc_info.pNext = NULL;
1683 alloc_info.memoryTypeIndex = 0;
1684
1685 // Ensure memory is big enough for both bindings
1686 static const VkDeviceSize allocation_size = 0x10000;
1687 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001688 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 -06001689 if (!pass) {
1690 vkDestroyBuffer(m_device->device(), buffer, NULL);
1691 return;
1692 }
1693 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1694 ASSERT_VK_SUCCESS(err);
1695
1696 uint8_t *pData;
1697 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 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 -06001699 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1700 m_errorMonitor->VerifyFound();
1701 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001702 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001703 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1705 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1706 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 m_errorMonitor->VerifyFound();
1708
1709 // Unmap the memory to avoid re-map error
1710 vkUnmapMemory(m_device->device(), mem);
1711 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1713 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1714 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001715 m_errorMonitor->VerifyFound();
1716 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1718 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001719 m_errorMonitor->VerifyFound();
1720 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001722 vkUnmapMemory(m_device->device(), mem);
1723 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001724
Tobin Ehlis35372522016-05-12 08:32:31 -06001725 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001726 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001727 ASSERT_VK_SUCCESS(err);
1728 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001729 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001731 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001733 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1734 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001735
Tobin Ehlis35372522016-05-12 08:32:31 -06001736 // Now flush range that oversteps mapped range
1737 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001739 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001740 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001741 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1747 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001748 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001749 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001750 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001751 mmr.size = VK_WHOLE_SIZE;
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001756#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001757 // Some platforms have an atomsize of 1 which makes the test meaningless
1758 if (atom_size > 3) {
1759 // Now with an offset NOT a multiple of the device limit
1760 vkUnmapMemory(m_device->device(), mem);
1761 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1762 ASSERT_VK_SUCCESS(err);
1763 mmr.offset = 3; // Not a multiple of atom_size
1764 mmr.size = VK_WHOLE_SIZE;
1765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1766 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1767 m_errorMonitor->VerifyFound();
1768
1769 // Now with a size NOT a multiple of the device limit
1770 vkUnmapMemory(m_device->device(), mem);
1771 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1772 ASSERT_VK_SUCCESS(err);
1773 mmr.offset = atom_size;
1774 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1776 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1777 m_errorMonitor->VerifyFound();
1778 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001779#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001780 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1781 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001782 if (!pass) {
1783 vkFreeMemory(m_device->device(), mem, NULL);
1784 vkDestroyBuffer(m_device->device(), buffer, NULL);
1785 return;
1786 }
1787 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1788 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1789
1790 vkDestroyBuffer(m_device->device(), buffer, NULL);
1791 vkFreeMemory(m_device->device(), mem, NULL);
1792}
1793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001794#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001795TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1796 VkResult err;
1797 bool pass;
1798
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001799 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1800 // following declaration (which is temporarily being moved below):
1801 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001802 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001803 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001804 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001806 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001807 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001808
Tony Barbour1fa09702017-03-16 12:09:08 -06001809 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001810
Ian Elliott3f06ce52016-04-29 14:46:21 -06001811#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1812#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1813 // Use the functions from the VK_KHR_android_surface extension without
1814 // enabling that extension:
1815
1816 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001817 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1819 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820 pass = (err != VK_SUCCESS);
1821 ASSERT_TRUE(pass);
1822 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001823#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001824
Ian Elliott3f06ce52016-04-29 14:46:21 -06001825#if defined(VK_USE_PLATFORM_MIR_KHR)
1826 // Use the functions from the VK_KHR_mir_surface extension without enabling
1827 // that extension:
1828
1829 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001830 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001832 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1833 pass = (err != VK_SUCCESS);
1834 ASSERT_TRUE(pass);
1835 m_errorMonitor->VerifyFound();
1836
1837 // Tell whether an mir_connection supports presentation:
1838 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1840 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001842#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001843
Ian Elliott3f06ce52016-04-29 14:46:21 -06001844#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1845 // Use the functions from the VK_KHR_wayland_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether an wayland_display supports presentation:
1857 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1859 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001860 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001861#endif // VK_USE_PLATFORM_WAYLAND_KHR
1862#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001863
Ian Elliott3f06ce52016-04-29 14:46:21 -06001864#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1866 // TO NON-LINUX PLATFORMS:
1867 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001868 // Use the functions from the VK_KHR_win32_surface extension without
1869 // enabling that extension:
1870
1871 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001872 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1874 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001875 pass = (err != VK_SUCCESS);
1876 ASSERT_TRUE(pass);
1877 m_errorMonitor->VerifyFound();
1878
1879 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001881 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001882 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001883// Set this (for now, until all platforms are supported and tested):
1884#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001885#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001886#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001887 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1888 // TO NON-LINUX PLATFORMS:
1889 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001890#endif
1891#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001892 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1893 // that extension:
1894
1895 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001896 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001898 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1899 pass = (err != VK_SUCCESS);
1900 ASSERT_TRUE(pass);
1901 m_errorMonitor->VerifyFound();
1902
1903 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001904 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001905 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1907 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001908 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001909// Set this (for now, until all platforms are supported and tested):
1910#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001911#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001912
Ian Elliott12630812016-04-29 14:35:43 -06001913#if defined(VK_USE_PLATFORM_XLIB_KHR)
1914 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1915 // that extension:
1916
1917 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001918 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001920 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1921 pass = (err != VK_SUCCESS);
1922 ASSERT_TRUE(pass);
1923 m_errorMonitor->VerifyFound();
1924
1925 // Tell whether an Xlib VisualID supports presentation:
1926 Display *dpy = NULL;
1927 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001929 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1930 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001931// Set this (for now, until all platforms are supported and tested):
1932#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001933#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001934
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001935// Use the functions from the VK_KHR_surface extension without enabling
1936// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001937
Ian Elliott489eec02016-05-05 14:12:44 -06001938#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001941 vkDestroySurfaceKHR(instance(), surface, NULL);
1942 m_errorMonitor->VerifyFound();
1943
1944 // Check if surface supports presentation:
1945 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001947 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1948 pass = (err != VK_SUCCESS);
1949 ASSERT_TRUE(pass);
1950 m_errorMonitor->VerifyFound();
1951
1952 // Check surface capabilities:
1953 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1955 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 pass = (err != VK_SUCCESS);
1957 ASSERT_TRUE(pass);
1958 m_errorMonitor->VerifyFound();
1959
1960 // Check surface formats:
1961 uint32_t format_count = 0;
1962 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1964 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001965 pass = (err != VK_SUCCESS);
1966 ASSERT_TRUE(pass);
1967 m_errorMonitor->VerifyFound();
1968
1969 // Check surface present modes:
1970 uint32_t present_mode_count = 0;
1971 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1973 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001974 pass = (err != VK_SUCCESS);
1975 ASSERT_TRUE(pass);
1976 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001977#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001978
Ian Elliott1c32c772016-04-28 14:47:13 -06001979 // Use the functions from the VK_KHR_swapchain extension without enabling
1980 // that extension:
1981
1982 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001984 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1985 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001986 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001987 pass = (err != VK_SUCCESS);
1988 ASSERT_TRUE(pass);
1989 m_errorMonitor->VerifyFound();
1990
1991 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1993 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001994 pass = (err != VK_SUCCESS);
1995 ASSERT_TRUE(pass);
1996 m_errorMonitor->VerifyFound();
1997
Chris Forbeseb7d5502016-09-13 18:19:21 +12001998 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1999 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2000 VkFence fence;
2001 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2002
Ian Elliott1c32c772016-04-28 14:47:13 -06002003 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12002005 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06002006 pass = (err != VK_SUCCESS);
2007 ASSERT_TRUE(pass);
2008 m_errorMonitor->VerifyFound();
2009
Chris Forbeseb7d5502016-09-13 18:19:21 +12002010 vkDestroyFence(m_device->device(), fence, nullptr);
2011
Ian Elliott1c32c772016-04-28 14:47:13 -06002012 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002013 //
2014 // NOTE: Currently can't test this because a real swapchain is needed (as
2015 // opposed to the fake one we created) in order for the layer to lookup the
2016 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002017
2018 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002020 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2021 m_errorMonitor->VerifyFound();
2022}
Chris Forbes09368e42016-10-13 11:59:22 +13002023#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002024
Karl Schultz6addd812016-02-02 17:17:23 -07002025TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2026 VkResult err;
2027 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002028
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2030 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002031
Tony Barbour1fa09702017-03-16 12:09:08 -06002032 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033
2034 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002035 VkImage image;
2036 VkDeviceMemory mem;
2037 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002038
Karl Schultz6addd812016-02-02 17:17:23 -07002039 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2040 const int32_t tex_width = 32;
2041 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042
Tony Barboureb254902015-07-15 12:50:33 -06002043 VkImageCreateInfo image_create_info = {};
2044 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002045 image_create_info.pNext = NULL;
2046 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2047 image_create_info.format = tex_format;
2048 image_create_info.extent.width = tex_width;
2049 image_create_info.extent.height = tex_height;
2050 image_create_info.extent.depth = 1;
2051 image_create_info.mipLevels = 1;
2052 image_create_info.arrayLayers = 1;
2053 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2054 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2055 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2056 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002057 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002058
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002059 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002060 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002061 mem_alloc.pNext = NULL;
2062 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002063
Chia-I Wuf7458c52015-10-26 21:10:41 +08002064 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002065 ASSERT_VK_SUCCESS(err);
2066
Karl Schultz6addd812016-02-02 17:17:23 -07002067 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002068
Mark Lobodzinski23065352015-05-29 09:32:35 -05002069 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002071 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 -07002072 if (!pass) { // If we can't find any unmappable memory this test doesn't
2073 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002074 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002075 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002076 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002077
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002078 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002079 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002080 ASSERT_VK_SUCCESS(err);
2081
2082 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002083 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002084 ASSERT_VK_SUCCESS(err);
2085
2086 // Map memory as if to initialize the image
2087 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002088 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002089
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002090 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002091
Chia-I Wuf7458c52015-10-26 21:10:41 +08002092 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002093 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002094}
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096TEST_F(VkLayerTest, RebindMemory) {
2097 VkResult err;
2098 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002101
Tony Barbour1fa09702017-03-16 12:09:08 -06002102 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002103
2104 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002105 VkImage image;
2106 VkDeviceMemory mem1;
2107 VkDeviceMemory mem2;
2108 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002109
Karl Schultz6addd812016-02-02 17:17:23 -07002110 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2111 const int32_t tex_width = 32;
2112 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002113
Tony Barboureb254902015-07-15 12:50:33 -06002114 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002115 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2116 image_create_info.pNext = NULL;
2117 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2118 image_create_info.format = tex_format;
2119 image_create_info.extent.width = tex_width;
2120 image_create_info.extent.height = tex_height;
2121 image_create_info.extent.depth = 1;
2122 image_create_info.mipLevels = 1;
2123 image_create_info.arrayLayers = 1;
2124 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2125 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2126 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2127 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002129 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002130 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2131 mem_alloc.pNext = NULL;
2132 mem_alloc.allocationSize = 0;
2133 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002134
Karl Schultz6addd812016-02-02 17:17:23 -07002135 // Introduce failure, do NOT set memProps to
2136 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002137 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002138 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002139 ASSERT_VK_SUCCESS(err);
2140
Karl Schultz6addd812016-02-02 17:17:23 -07002141 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002142
2143 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002144 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002145 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002146
2147 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002148 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002149 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002150 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002151 ASSERT_VK_SUCCESS(err);
2152
2153 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002154 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002155 ASSERT_VK_SUCCESS(err);
2156
Karl Schultz6addd812016-02-02 17:17:23 -07002157 // Introduce validation failure, try to bind a different memory object to
2158 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002159 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002161 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002162
Chia-I Wuf7458c52015-10-26 21:10:41 +08002163 vkDestroyImage(m_device->device(), image, NULL);
2164 vkFreeMemory(m_device->device(), mem1, NULL);
2165 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002166}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002167
Karl Schultz6addd812016-02-02 17:17:23 -07002168TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002169 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002170
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2172 "submitted in SIGNALED state. Fences "
2173 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002174
2175 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002176 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2177 fenceInfo.pNext = NULL;
2178 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002179
Tony Barbour1fa09702017-03-16 12:09:08 -06002180 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002181 ASSERT_NO_FATAL_FAILURE(InitViewport());
2182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2183
Tony Barbour552f6c02016-12-21 14:34:07 -07002184 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002185 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002186 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002187
2188 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002189
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002190 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002191 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2192 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002193 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002194 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002195 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002196 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002197 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002198 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002199 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002200
2201 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002202 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002204 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002205}
Chris Forbes4e44c912016-06-16 10:20:00 +12002206
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002207TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002208 TEST_DESCRIPTION(
2209 "Specify wrong usage for image then create conflicting view of image "
2210 "Initialize buffer with wrong usage then perform copy expecting errors "
2211 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbour1fa09702017-03-16 12:09:08 -06002214 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002215 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002216 if (!format) {
2217 printf(" No Depth + Stencil format found. Skipped.\n");
2218 return;
2219 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002220
Tony Barbourf92621a2016-05-02 14:28:12 -06002221 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002222 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002223 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002224 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002225
Tony Barbourf92621a2016-05-02 14:28:12 -06002226 VkImageView dsv;
2227 VkImageViewCreateInfo dsvci = {};
2228 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2229 dsvci.image = image.handle();
2230 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002231 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002232 dsvci.subresourceRange.layerCount = 1;
2233 dsvci.subresourceRange.baseMipLevel = 0;
2234 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002235 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002236
Tony Barbourf92621a2016-05-02 14:28:12 -06002237 // Create a view with depth / stencil aspect for image with different usage
2238 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002239
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002240 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002241
2242 // Initialize buffer with TRANSFER_DST usage
2243 vk_testing::Buffer buffer;
2244 VkMemoryPropertyFlags reqs = 0;
2245 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2246 VkBufferImageCopy region = {};
2247 region.bufferRowLength = 128;
2248 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002249 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002250 region.imageSubresource.layerCount = 1;
2251 region.imageExtent.height = 16;
2252 region.imageExtent.width = 16;
2253 region.imageExtent.depth = 1;
2254
Mark Lobodzinski80871462017-02-16 10:37:27 -07002255 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002256 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002257
Chris Forbesda581202016-10-06 18:25:26 +13002258 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2260 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 +13002261
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002262 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2263 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002264 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002265}
Tony Barbour75d79f02016-08-30 09:39:07 -06002266
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002267TEST_F(VkLayerTest, LeakAnObject) {
2268 VkResult err;
2269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002270 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002271
2272 // Note that we have to create a new device since destroying the
2273 // framework's device causes Teardown() to fail and just calling Teardown
2274 // will destroy the errorMonitor.
2275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002277
Tony Barbour1fa09702017-03-16 12:09:08 -06002278 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002279
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002280 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002281 std::vector<VkDeviceQueueCreateInfo> queue_info;
2282 queue_info.reserve(queue_props.size());
2283 std::vector<std::vector<float>> queue_priorities;
2284 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2285 VkDeviceQueueCreateInfo qi = {};
2286 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2287 qi.pNext = NULL;
2288 qi.queueFamilyIndex = i;
2289 qi.queueCount = queue_props[i].queueCount;
2290 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2291 qi.pQueuePriorities = queue_priorities[i].data();
2292 queue_info.push_back(qi);
2293 }
2294
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002296
2297 // The sacrificial device object
2298 VkDevice testDevice;
2299 VkDeviceCreateInfo device_create_info = {};
2300 auto features = m_device->phy().features();
2301 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2302 device_create_info.pNext = NULL;
2303 device_create_info.queueCreateInfoCount = queue_info.size();
2304 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002305 device_create_info.enabledLayerCount = 0;
2306 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307 device_create_info.pEnabledFeatures = &features;
2308 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2309 ASSERT_VK_SUCCESS(err);
2310
2311 VkFence fence;
2312 VkFenceCreateInfo fence_create_info = {};
2313 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2314 fence_create_info.pNext = NULL;
2315 fence_create_info.flags = 0;
2316 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2317 ASSERT_VK_SUCCESS(err);
2318
2319 // Induce failure by not calling vkDestroyFence
2320 vkDestroyDevice(testDevice, NULL);
2321 m_errorMonitor->VerifyFound();
2322}
2323
2324TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002325 TEST_DESCRIPTION(
2326 "Allocate command buffers from one command pool and "
2327 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
Tony Barbour1fa09702017-03-16 12:09:08 -06002331 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 VkCommandPool command_pool_one;
2333 VkCommandPool command_pool_two;
2334
2335 VkCommandPoolCreateInfo pool_create_info{};
2336 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2337 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2338 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2339
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002340 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002342 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002344 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002348 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002349 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002350 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002351
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002352 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002353
2354 m_errorMonitor->VerifyFound();
2355
2356 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2357 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2358}
2359
2360TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2361 VkResult err;
2362
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002363 TEST_DESCRIPTION(
2364 "Allocate descriptor sets from one DS pool and "
2365 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002366
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368
Tony Barbour1fa09702017-03-16 12:09:08 -06002369 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2371
2372 VkDescriptorPoolSize ds_type_count = {};
2373 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2374 ds_type_count.descriptorCount = 1;
2375
2376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2378 ds_pool_ci.pNext = NULL;
2379 ds_pool_ci.flags = 0;
2380 ds_pool_ci.maxSets = 1;
2381 ds_pool_ci.poolSizeCount = 1;
2382 ds_pool_ci.pPoolSizes = &ds_type_count;
2383
2384 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002385 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386 ASSERT_VK_SUCCESS(err);
2387
2388 // Create a second descriptor pool
2389 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002390 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002391 ASSERT_VK_SUCCESS(err);
2392
2393 VkDescriptorSetLayoutBinding dsl_binding = {};
2394 dsl_binding.binding = 0;
2395 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2396 dsl_binding.descriptorCount = 1;
2397 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2398 dsl_binding.pImmutableSamplers = NULL;
2399
2400 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2401 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2402 ds_layout_ci.pNext = NULL;
2403 ds_layout_ci.bindingCount = 1;
2404 ds_layout_ci.pBindings = &dsl_binding;
2405
2406 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002407 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002408 ASSERT_VK_SUCCESS(err);
2409
2410 VkDescriptorSet descriptorSet;
2411 VkDescriptorSetAllocateInfo alloc_info = {};
2412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2413 alloc_info.descriptorSetCount = 1;
2414 alloc_info.descriptorPool = ds_pool_one;
2415 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002417 ASSERT_VK_SUCCESS(err);
2418
2419 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2420
2421 m_errorMonitor->VerifyFound();
2422
2423 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2424 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2425 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2426}
2427
2428TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002431 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002432
Tony Barbour1fa09702017-03-16 12:09:08 -06002433 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
2435 // Pass bogus handle into GetImageMemoryRequirements
2436 VkMemoryRequirements mem_reqs;
2437 uint64_t fakeImageHandle = 0xCADECADE;
2438 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2439
2440 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2441
2442 m_errorMonitor->VerifyFound();
2443}
2444
Mike Schuchardt17838902017-02-21 09:48:06 -07002445TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2446 TEST_DESCRIPTION(
2447 "Try to destroy a render pass object using a device other than the one it was created on. "
2448 "This should generate a distinct error from the invalid handle error.");
2449 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002450 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2452
2453 // Create second device
2454 float priorities[] = {1.0f};
2455 VkDeviceQueueCreateInfo queue_info{};
2456 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2457 queue_info.pNext = NULL;
2458 queue_info.flags = 0;
2459 queue_info.queueFamilyIndex = 0;
2460 queue_info.queueCount = 1;
2461 queue_info.pQueuePriorities = &priorities[0];
2462
2463 VkDeviceCreateInfo device_create_info = {};
2464 auto features = m_device->phy().features();
2465 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2466 device_create_info.pNext = NULL;
2467 device_create_info.queueCreateInfoCount = 1;
2468 device_create_info.pQueueCreateInfos = &queue_info;
2469 device_create_info.enabledLayerCount = 0;
2470 device_create_info.ppEnabledLayerNames = NULL;
2471 device_create_info.pEnabledFeatures = &features;
2472
2473 VkDevice second_device;
2474 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2475
2476 // Try to destroy the renderpass from the first device using the second device
2477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2478 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2479 m_errorMonitor->VerifyFound();
2480
2481 vkDestroyDevice(second_device, NULL);
2482}
2483
Karl Schultz6addd812016-02-02 17:17:23 -07002484TEST_F(VkLayerTest, PipelineNotBound) {
2485 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002487 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002488
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002490
Tony Barbour1fa09702017-03-16 12:09:08 -06002491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002493
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002494 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002495 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2496 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002497
2498 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002499 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2500 ds_pool_ci.pNext = NULL;
2501 ds_pool_ci.maxSets = 1;
2502 ds_pool_ci.poolSizeCount = 1;
2503 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002504
2505 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002506 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002507 ASSERT_VK_SUCCESS(err);
2508
2509 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002510 dsl_binding.binding = 0;
2511 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2512 dsl_binding.descriptorCount = 1;
2513 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2514 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002515
2516 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002517 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2518 ds_layout_ci.pNext = NULL;
2519 ds_layout_ci.bindingCount = 1;
2520 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002521
2522 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002523 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002524 ASSERT_VK_SUCCESS(err);
2525
2526 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002527 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002528 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002529 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002530 alloc_info.descriptorPool = ds_pool;
2531 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002533 ASSERT_VK_SUCCESS(err);
2534
2535 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002536 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2537 pipeline_layout_ci.pNext = NULL;
2538 pipeline_layout_ci.setLayoutCount = 1;
2539 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002540
2541 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002542 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002543 ASSERT_VK_SUCCESS(err);
2544
Mark Youngad779052016-01-06 14:26:04 -07002545 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002546
Tony Barbour552f6c02016-12-21 14:34:07 -07002547 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002548 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002550 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002551
Chia-I Wuf7458c52015-10-26 21:10:41 +08002552 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2553 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2554 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002555}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002556
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002557TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2558 VkResult err;
2559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002560 TEST_DESCRIPTION(
2561 "Test validation check for an invalid memory type index "
2562 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002563
Tony Barbour1fa09702017-03-16 12:09:08 -06002564 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002565
2566 // Create an image, allocate memory, set a bad typeIndex and then try to
2567 // bind it
2568 VkImage image;
2569 VkDeviceMemory mem;
2570 VkMemoryRequirements mem_reqs;
2571 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2572 const int32_t tex_width = 32;
2573 const int32_t tex_height = 32;
2574
2575 VkImageCreateInfo image_create_info = {};
2576 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2577 image_create_info.pNext = NULL;
2578 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2579 image_create_info.format = tex_format;
2580 image_create_info.extent.width = tex_width;
2581 image_create_info.extent.height = tex_height;
2582 image_create_info.extent.depth = 1;
2583 image_create_info.mipLevels = 1;
2584 image_create_info.arrayLayers = 1;
2585 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2586 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2587 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2588 image_create_info.flags = 0;
2589
2590 VkMemoryAllocateInfo mem_alloc = {};
2591 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2592 mem_alloc.pNext = NULL;
2593 mem_alloc.allocationSize = 0;
2594 mem_alloc.memoryTypeIndex = 0;
2595
2596 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2597 ASSERT_VK_SUCCESS(err);
2598
2599 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2600 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002601
2602 // Introduce Failure, select invalid TypeIndex
2603 VkPhysicalDeviceMemoryProperties memory_info;
2604
2605 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2606 unsigned int i;
2607 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2608 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2609 mem_alloc.memoryTypeIndex = i;
2610 break;
2611 }
2612 }
2613 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002614 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002615 vkDestroyImage(m_device->device(), image, NULL);
2616 return;
2617 }
2618
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002619 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 -06002620
2621 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2622 ASSERT_VK_SUCCESS(err);
2623
2624 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2625 (void)err;
2626
2627 m_errorMonitor->VerifyFound();
2628
2629 vkDestroyImage(m_device->device(), image, NULL);
2630 vkFreeMemory(m_device->device(), mem, NULL);
2631}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002632
Karl Schultz6addd812016-02-02 17:17:23 -07002633TEST_F(VkLayerTest, BindInvalidMemory) {
2634 VkResult err;
2635 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Tony Barbour1fa09702017-03-16 12:09:08 -06002637 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002638
Cortf801b982017-01-17 18:10:21 -08002639 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002640 const int32_t tex_width = 256;
2641 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
2643 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002644 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2645 image_create_info.pNext = NULL;
2646 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2647 image_create_info.format = tex_format;
2648 image_create_info.extent.width = tex_width;
2649 image_create_info.extent.height = tex_height;
2650 image_create_info.extent.depth = 1;
2651 image_create_info.mipLevels = 1;
2652 image_create_info.arrayLayers = 1;
2653 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002654 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002655 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2656 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 VkBufferCreateInfo buffer_create_info = {};
2659 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2660 buffer_create_info.pNext = NULL;
2661 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002662 buffer_create_info.size = 4 * 1024 * 1024;
2663 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002664 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002665
Cortf801b982017-01-17 18:10:21 -08002666 // Create an image/buffer, allocate memory, free it, and then try to bind it
2667 {
2668 VkImage image = VK_NULL_HANDLE;
2669 VkBuffer buffer = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2673 ASSERT_VK_SUCCESS(err);
2674 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2675 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2676 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002677
Cortf801b982017-01-17 18:10:21 -08002678 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2679 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_mem_alloc.allocationSize = image_mem_reqs.size;
2681 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2682 ASSERT_TRUE(pass);
2683 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2684 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2686 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002687
Cortf801b982017-01-17 18:10:21 -08002688 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2689 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2690 ASSERT_VK_SUCCESS(err);
2691 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2692 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002693
Cortf801b982017-01-17 18:10:21 -08002694 vkFreeMemory(device(), image_mem, NULL);
2695 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002696
Cortf801b982017-01-17 18:10:21 -08002697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2698 err = vkBindImageMemory(device(), image, image_mem, 0);
2699 (void)err; // This may very well return an error.
2700 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002701
Cortf801b982017-01-17 18:10:21 -08002702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002706
Cortf801b982017-01-17 18:10:21 -08002707 vkDestroyImage(m_device->device(), image, NULL);
2708 vkDestroyBuffer(m_device->device(), buffer, NULL);
2709 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002710
2711 // Try to bind memory to an object that already has a memory binding
2712 {
2713 VkImage image = VK_NULL_HANDLE;
2714 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2715 ASSERT_VK_SUCCESS(err);
2716 VkBuffer buffer = VK_NULL_HANDLE;
2717 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2718 ASSERT_VK_SUCCESS(err);
2719 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2720 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2721 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2722 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2723 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2724 image_alloc_info.allocationSize = image_mem_reqs.size;
2725 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2726 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2727 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2728 ASSERT_TRUE(pass);
2729 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2730 ASSERT_TRUE(pass);
2731 VkDeviceMemory image_mem, buffer_mem;
2732 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2733 ASSERT_VK_SUCCESS(err);
2734 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2735 ASSERT_VK_SUCCESS(err);
2736
2737 err = vkBindImageMemory(device(), image, image_mem, 0);
2738 ASSERT_VK_SUCCESS(err);
2739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2740 err = vkBindImageMemory(device(), image, image_mem, 0);
2741 (void)err; // This may very well return an error.
2742 m_errorMonitor->VerifyFound();
2743
2744 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2745 ASSERT_VK_SUCCESS(err);
2746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2747 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2748 (void)err; // This may very well return an error.
2749 m_errorMonitor->VerifyFound();
2750
2751 vkFreeMemory(device(), image_mem, NULL);
2752 vkFreeMemory(device(), buffer_mem, NULL);
2753 vkDestroyImage(device(), image, NULL);
2754 vkDestroyBuffer(device(), buffer, NULL);
2755 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002756
Cort Strattonde748202017-02-17 12:50:01 -08002757 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002758 {
2759 VkImage image = VK_NULL_HANDLE;
2760 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2761 ASSERT_VK_SUCCESS(err);
2762 VkBuffer buffer = VK_NULL_HANDLE;
2763 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2764 ASSERT_VK_SUCCESS(err);
2765 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2766 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2767 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2768 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2769 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002770 // Leave some extra space for alignment wiggle room
2771 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002772 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002773 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002774 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2775 ASSERT_TRUE(pass);
2776 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2777 ASSERT_TRUE(pass);
2778 VkDeviceMemory image_mem, buffer_mem;
2779 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2780 ASSERT_VK_SUCCESS(err);
2781 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2782 ASSERT_VK_SUCCESS(err);
2783
Cort Strattonde748202017-02-17 12:50:01 -08002784 // Test unaligned memory offset
2785 {
2786 if (image_mem_reqs.alignment > 1) {
2787 VkDeviceSize image_offset = 1;
2788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2789 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2790 (void)err; // This may very well return an error.
2791 m_errorMonitor->VerifyFound();
2792 }
Cort6c7dff72017-01-27 18:34:50 -08002793
Cort Strattonde748202017-02-17 12:50:01 -08002794 if (buffer_mem_reqs.alignment > 1) {
2795 VkDeviceSize buffer_offset = 1;
2796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2797 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2798 (void)err; // This may very well return an error.
2799 m_errorMonitor->VerifyFound();
2800 }
2801 }
2802
2803 // Test memory offsets outside the memory allocation
2804 {
2805 VkDeviceSize image_offset =
2806 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2808 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2809 (void)err; // This may very well return an error.
2810 m_errorMonitor->VerifyFound();
2811
2812 VkDeviceSize buffer_offset =
2813 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2815 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2816 (void)err; // This may very well return an error.
2817 m_errorMonitor->VerifyFound();
2818 }
2819
2820 // Test memory offsets within the memory allocation, but which leave too little memory for
2821 // the resource.
2822 {
2823 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002824 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2826 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2827 (void)err; // This may very well return an error.
2828 m_errorMonitor->VerifyFound();
2829 }
2830
2831 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2832 if (buffer_offset > 0) {
2833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2834 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2835 (void)err; // This may very well return an error.
2836 m_errorMonitor->VerifyFound();
2837 }
2838 }
Cort6c7dff72017-01-27 18:34:50 -08002839
2840 vkFreeMemory(device(), image_mem, NULL);
2841 vkFreeMemory(device(), buffer_mem, NULL);
2842 vkDestroyImage(device(), image, NULL);
2843 vkDestroyBuffer(device(), buffer, NULL);
2844 }
2845
Cort Stratton4c38bb52017-01-28 13:33:10 -08002846 // Try to bind memory to an object with an invalid memory type
2847 {
2848 VkImage image = VK_NULL_HANDLE;
2849 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2850 ASSERT_VK_SUCCESS(err);
2851 VkBuffer buffer = VK_NULL_HANDLE;
2852 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2853 ASSERT_VK_SUCCESS(err);
2854 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2855 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2856 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2857 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2858 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2859 image_alloc_info.allocationSize = image_mem_reqs.size;
2860 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2861 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002862 // Create a mask of available memory types *not* supported by these resources,
2863 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002864 VkPhysicalDeviceMemoryProperties memory_properties = {};
2865 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002866 VkDeviceMemory image_mem, buffer_mem;
2867
Cort Stratton4c38bb52017-01-28 13:33:10 -08002868 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002869 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002870 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2871 ASSERT_TRUE(pass);
2872 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2873 ASSERT_VK_SUCCESS(err);
2874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2875 err = vkBindImageMemory(device(), image, image_mem, 0);
2876 (void)err; // This may very well return an error.
2877 m_errorMonitor->VerifyFound();
2878 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002879 }
2880
Cort Stratton4c38bb52017-01-28 13:33:10 -08002881 uint32_t buffer_unsupported_mem_type_bits =
2882 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002883 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002884 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2885 ASSERT_TRUE(pass);
2886 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2889 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2890 (void)err; // This may very well return an error.
2891 m_errorMonitor->VerifyFound();
2892 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002893 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002894
Cort Stratton4c38bb52017-01-28 13:33:10 -08002895 vkDestroyImage(device(), image, NULL);
2896 vkDestroyBuffer(device(), buffer, NULL);
2897 }
2898
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002899 // Try to bind memory to an image created with sparse memory flags
2900 {
2901 VkImageCreateInfo sparse_image_create_info = image_create_info;
2902 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2903 VkImageFormatProperties image_format_properties = {};
2904 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2905 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2906 sparse_image_create_info.usage, sparse_image_create_info.flags,
2907 &image_format_properties);
2908 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2909 // most likely means sparse formats aren't supported here; skip this test.
2910 } else {
2911 ASSERT_VK_SUCCESS(err);
2912 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002913 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002914 return;
2915 } else {
2916 VkImage sparse_image = VK_NULL_HANDLE;
2917 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2918 ASSERT_VK_SUCCESS(err);
2919 VkMemoryRequirements sparse_mem_reqs = {};
2920 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2921 if (sparse_mem_reqs.memoryTypeBits != 0) {
2922 VkMemoryAllocateInfo sparse_mem_alloc = {};
2923 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2924 sparse_mem_alloc.pNext = NULL;
2925 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2926 sparse_mem_alloc.memoryTypeIndex = 0;
2927 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2928 ASSERT_TRUE(pass);
2929 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2930 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2931 ASSERT_VK_SUCCESS(err);
2932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2933 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2934 // This may very well return an error.
2935 (void)err;
2936 m_errorMonitor->VerifyFound();
2937 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2938 }
2939 vkDestroyImage(m_device->device(), sparse_image, NULL);
2940 }
2941 }
2942 }
2943
2944 // Try to bind memory to a buffer created with sparse memory flags
2945 {
2946 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2947 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2948 if (!m_device->phy().features().sparseResidencyBuffer) {
2949 // most likely means sparse formats aren't supported here; skip this test.
2950 } else {
2951 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2952 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2953 ASSERT_VK_SUCCESS(err);
2954 VkMemoryRequirements sparse_mem_reqs = {};
2955 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2956 if (sparse_mem_reqs.memoryTypeBits != 0) {
2957 VkMemoryAllocateInfo sparse_mem_alloc = {};
2958 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2959 sparse_mem_alloc.pNext = NULL;
2960 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2961 sparse_mem_alloc.memoryTypeIndex = 0;
2962 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2963 ASSERT_TRUE(pass);
2964 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2965 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2966 ASSERT_VK_SUCCESS(err);
2967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2968 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2969 // This may very well return an error.
2970 (void)err;
2971 m_errorMonitor->VerifyFound();
2972 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2973 }
2974 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2975 }
2976 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002977}
2978
Karl Schultz6addd812016-02-02 17:17:23 -07002979TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2980 VkResult err;
2981 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002984
Tony Barbour1fa09702017-03-16 12:09:08 -06002985 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002986
Karl Schultz6addd812016-02-02 17:17:23 -07002987 // Create an image object, allocate memory, destroy the object and then try
2988 // to bind it
2989 VkImage image;
2990 VkDeviceMemory mem;
2991 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002992
Karl Schultz6addd812016-02-02 17:17:23 -07002993 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2994 const int32_t tex_width = 32;
2995 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002996
2997 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002998 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2999 image_create_info.pNext = NULL;
3000 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3001 image_create_info.format = tex_format;
3002 image_create_info.extent.width = tex_width;
3003 image_create_info.extent.height = tex_height;
3004 image_create_info.extent.depth = 1;
3005 image_create_info.mipLevels = 1;
3006 image_create_info.arrayLayers = 1;
3007 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3008 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3009 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3010 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003011
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003012 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003013 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3014 mem_alloc.pNext = NULL;
3015 mem_alloc.allocationSize = 0;
3016 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003017
Chia-I Wuf7458c52015-10-26 21:10:41 +08003018 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003019 ASSERT_VK_SUCCESS(err);
3020
Karl Schultz6addd812016-02-02 17:17:23 -07003021 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003022
3023 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003024 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003025 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003026
3027 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003028 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003029 ASSERT_VK_SUCCESS(err);
3030
3031 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003032 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003033 ASSERT_VK_SUCCESS(err);
3034
3035 // Now Try to bind memory to this destroyed object
3036 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3037 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003038 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003040 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003041
Chia-I Wuf7458c52015-10-26 21:10:41 +08003042 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003043}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003044
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003045TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3046 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3047
Tony Barbour1fa09702017-03-16 12:09:08 -06003048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3050
3051 VkVertexInputBindingDescription input_binding;
3052 memset(&input_binding, 0, sizeof(input_binding));
3053
3054 VkVertexInputAttributeDescription input_attribs;
3055 memset(&input_attribs, 0, sizeof(input_attribs));
3056
3057 // Pick a really bad format for this purpose and make sure it should fail
3058 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3059 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3060 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003061 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003062 return;
3063 }
3064
3065 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003066 char const *vsSource =
3067 "#version 450\n"
3068 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003069 "void main(){\n"
3070 " gl_Position = vec4(1);\n"
3071 "}\n";
3072 char const *fsSource =
3073 "#version 450\n"
3074 "\n"
3075 "layout(location=0) out vec4 color;\n"
3076 "void main(){\n"
3077 " color = vec4(1);\n"
3078 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003079
3080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3081 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3082 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3083
3084 VkPipelineObj pipe(m_device);
3085 pipe.AddColorAttachment();
3086 pipe.AddShader(&vs);
3087 pipe.AddShader(&fs);
3088
3089 pipe.AddVertexInputBindings(&input_binding, 1);
3090 pipe.AddVertexInputAttribs(&input_attribs, 1);
3091
3092 VkDescriptorSetObj descriptorSet(m_device);
3093 descriptorSet.AppendDummy();
3094 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3095
3096 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3097
3098 m_errorMonitor->VerifyFound();
3099}
3100
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003101TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003102 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003103 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104
3105 VkMemoryPropertyFlags reqs = 0;
3106 VkImageCreateInfo image_create_info = {};
3107 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3108 image_create_info.pNext = NULL;
3109 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3110 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3111 image_create_info.extent.width = 256;
3112 image_create_info.extent.height = 256;
3113 image_create_info.extent.depth = 1;
3114 image_create_info.mipLevels = 1;
3115 image_create_info.arrayLayers = 1;
3116 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3117 image_create_info.flags = 0;
3118
3119 VkImageBlit blit_region = {};
3120 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3121 blit_region.srcSubresource.baseArrayLayer = 0;
3122 blit_region.srcSubresource.layerCount = 1;
3123 blit_region.srcSubresource.mipLevel = 0;
3124 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3125 blit_region.dstSubresource.baseArrayLayer = 0;
3126 blit_region.dstSubresource.layerCount = 1;
3127 blit_region.dstSubresource.mipLevel = 0;
3128
3129 // Create two images, the source with sampleCount = 2, and attempt to blit
3130 // between them
3131 {
3132 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003133 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003134 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003139 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003140 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003141 m_errorMonitor->SetDesiredFailureMsg(
3142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3143 "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 -06003144 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3145 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 m_errorMonitor->VerifyFound();
3147 m_commandBuffer->EndCommandBuffer();
3148 }
3149
3150 // Create two images, the dest with sampleCount = 4, and attempt to blit
3151 // between them
3152 {
3153 image_create_info.samples = VK_SAMPLE_COUNT_1_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 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003158 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003159 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003161 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003162 m_errorMonitor->SetDesiredFailureMsg(
3163 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3164 "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 -06003165 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3166 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_errorMonitor->VerifyFound();
3168 m_commandBuffer->EndCommandBuffer();
3169 }
3170
3171 VkBufferImageCopy copy_region = {};
3172 copy_region.bufferRowLength = 128;
3173 copy_region.bufferImageHeight = 128;
3174 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3175 copy_region.imageSubresource.layerCount = 1;
3176 copy_region.imageExtent.height = 64;
3177 copy_region.imageExtent.width = 64;
3178 copy_region.imageExtent.depth = 1;
3179
3180 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3181 // buffer to image
3182 {
3183 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003184 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3185 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003186 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003187 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003188 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003189 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003190 m_errorMonitor->SetDesiredFailureMsg(
3191 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3192 "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 -06003193 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3194 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003195 m_errorMonitor->VerifyFound();
3196 m_commandBuffer->EndCommandBuffer();
3197 }
3198
3199 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3200 // image to buffer
3201 {
3202 vk_testing::Buffer dst_buffer;
3203 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3204 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003205 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003206 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003207 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003208 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003209 m_errorMonitor->SetDesiredFailureMsg(
3210 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3211 "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 -06003212 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003213 dst_buffer.handle(), 1, &copy_region);
3214 m_errorMonitor->VerifyFound();
3215 m_commandBuffer->EndCommandBuffer();
3216 }
3217}
3218
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003219TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003221
3222 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003223 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 -06003224 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003225 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 -06003226 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003227 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 -06003228
3229 VkImageBlit blitRegion = {};
3230 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3231 blitRegion.srcSubresource.baseArrayLayer = 0;
3232 blitRegion.srcSubresource.layerCount = 1;
3233 blitRegion.srcSubresource.mipLevel = 0;
3234 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3235 blitRegion.dstSubresource.baseArrayLayer = 0;
3236 blitRegion.dstSubresource.layerCount = 1;
3237 blitRegion.dstSubresource.mipLevel = 0;
3238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3240
3241 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3242 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003243
3244 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003245 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003246 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003247 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003248
3249 m_errorMonitor->VerifyFound();
3250
Dave Houlton34df4cb2016-12-01 16:43:06 -07003251 // Test should generate 2 VU failures
3252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003254
3255 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003256 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003257 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003258
Dave Houlton34df4cb2016-12-01 16:43:06 -07003259 // TODO: Note that this only verifies that at least one of the VU enums was found
3260 // 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 -06003261 m_errorMonitor->VerifyFound();
3262
Tony Barbour552f6c02016-12-21 14:34:07 -07003263 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003264}
3265
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003266TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3267 VkResult err;
3268 bool pass;
3269
3270 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003271 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272
3273 // If w/d/h granularity is 1, test is not meaningful
3274 // TODO: When virtual device limits are available, create a set of limits for this test that
3275 // will always have a granularity of > 1 for w, h, and d
3276 auto index = m_device->graphics_queue_node_index_;
3277 auto queue_family_properties = m_device->phy().queue_properties();
3278
3279 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3280 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3281 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3282 return;
3283 }
3284
3285 // Create two images of different types and try to copy between them
3286 VkImage srcImage;
3287 VkImage dstImage;
3288 VkDeviceMemory srcMem;
3289 VkDeviceMemory destMem;
3290 VkMemoryRequirements memReqs;
3291
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003292 VkImageCreateInfo image_create_info = {};
3293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3294 image_create_info.pNext = NULL;
3295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3296 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3297 image_create_info.extent.width = 32;
3298 image_create_info.extent.height = 32;
3299 image_create_info.extent.depth = 1;
3300 image_create_info.mipLevels = 1;
3301 image_create_info.arrayLayers = 4;
3302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3303 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3304 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3305 image_create_info.flags = 0;
3306
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003307 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003308 ASSERT_VK_SUCCESS(err);
3309
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003311 ASSERT_VK_SUCCESS(err);
3312
3313 // Allocate memory
3314 VkMemoryAllocateInfo memAlloc = {};
3315 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3316 memAlloc.pNext = NULL;
3317 memAlloc.allocationSize = 0;
3318 memAlloc.memoryTypeIndex = 0;
3319
3320 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3321 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003322 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003323 ASSERT_TRUE(pass);
3324 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3325 ASSERT_VK_SUCCESS(err);
3326
3327 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3328 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003329 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003330 ASSERT_VK_SUCCESS(err);
3331 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3332 ASSERT_VK_SUCCESS(err);
3333
3334 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3335 ASSERT_VK_SUCCESS(err);
3336 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3337 ASSERT_VK_SUCCESS(err);
3338
Tony Barbour552f6c02016-12-21 14:34:07 -07003339 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003340 VkImageCopy copyRegion;
3341 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3342 copyRegion.srcSubresource.mipLevel = 0;
3343 copyRegion.srcSubresource.baseArrayLayer = 0;
3344 copyRegion.srcSubresource.layerCount = 1;
3345 copyRegion.srcOffset.x = 0;
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.srcOffset.z = 0;
3348 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3349 copyRegion.dstSubresource.mipLevel = 0;
3350 copyRegion.dstSubresource.baseArrayLayer = 0;
3351 copyRegion.dstSubresource.layerCount = 1;
3352 copyRegion.dstOffset.x = 0;
3353 copyRegion.dstOffset.y = 0;
3354 copyRegion.dstOffset.z = 0;
3355 copyRegion.extent.width = 1;
3356 copyRegion.extent.height = 1;
3357 copyRegion.extent.depth = 1;
3358
3359 // Introduce failure by setting srcOffset to a bad granularity value
3360 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3362 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003363 m_errorMonitor->VerifyFound();
3364
3365 // Introduce failure by setting extent to a bad granularity value
3366 copyRegion.srcOffset.y = 0;
3367 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3369 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003370 m_errorMonitor->VerifyFound();
3371
3372 // Now do some buffer/image copies
3373 vk_testing::Buffer buffer;
3374 VkMemoryPropertyFlags reqs = 0;
3375 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3376 VkBufferImageCopy region = {};
3377 region.bufferOffset = 0;
3378 region.bufferRowLength = 3;
3379 region.bufferImageHeight = 128;
3380 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3381 region.imageSubresource.layerCount = 1;
3382 region.imageExtent.height = 16;
3383 region.imageExtent.width = 16;
3384 region.imageExtent.depth = 1;
3385 region.imageOffset.x = 0;
3386 region.imageOffset.y = 0;
3387 region.imageOffset.z = 0;
3388
3389 // Introduce failure by setting bufferRowLength to a bad granularity value
3390 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3392 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3393 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003394 m_errorMonitor->VerifyFound();
3395 region.bufferRowLength = 128;
3396
3397 // Introduce failure by setting bufferOffset to a bad granularity value
3398 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3400 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3401 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003402 m_errorMonitor->VerifyFound();
3403 region.bufferOffset = 0;
3404
3405 // Introduce failure by setting bufferImageHeight to a bad granularity value
3406 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3408 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3409 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003410 m_errorMonitor->VerifyFound();
3411 region.bufferImageHeight = 128;
3412
3413 // Introduce failure by setting imageExtent to a bad granularity value
3414 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3416 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3417 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003418 m_errorMonitor->VerifyFound();
3419 region.imageExtent.width = 16;
3420
3421 // Introduce failure by setting imageOffset to a bad granularity value
3422 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3424 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3425 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003426 m_errorMonitor->VerifyFound();
3427
Tony Barbour552f6c02016-12-21 14:34:07 -07003428 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003429
3430 vkDestroyImage(m_device->device(), srcImage, NULL);
3431 vkDestroyImage(m_device->device(), dstImage, NULL);
3432 vkFreeMemory(m_device->device(), srcMem, NULL);
3433 vkFreeMemory(m_device->device(), destMem, NULL);
3434}
3435
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003436TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003437 TEST_DESCRIPTION(
3438 "Submit command buffer created using one queue family and "
3439 "attempt to submit them on a queue created in a different "
3440 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003441
Tony Barbour1fa09702017-03-16 12:09:08 -06003442 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003443
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003444 // This test is meaningless unless we have multiple queue families
3445 auto queue_family_properties = m_device->phy().queue_properties();
3446 if (queue_family_properties.size() < 2) {
3447 return;
3448 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003450 // Get safe index of another queue family
3451 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003452 VkQueue other_queue;
3453 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3454
3455 // Record an empty cmd buffer
3456 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3457 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3458 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3459 vkEndCommandBuffer(m_commandBuffer->handle());
3460
3461 // And submit on the wrong queue
3462 VkSubmitInfo submit_info = {};
3463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3464 submit_info.commandBufferCount = 1;
3465 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003466 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003467
3468 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003469}
3470
Chris Forbes4c24a922016-11-16 08:59:10 +13003471TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003472 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003473
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003474 // There are no attachments, but refer to attachment 0.
3475 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003476 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003477 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003478 };
3479
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003480 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003481 VkRenderPass rp;
3482
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003483 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003485 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3486 m_errorMonitor->VerifyFound();
3487}
3488
Chris Forbesa58c4522016-09-28 15:19:39 +13003489TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3490 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003491 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003492
3493 // A renderpass with two subpasses, both writing the same attachment.
3494 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3496 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3497 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003499 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003500 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003501 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3502 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003503 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003504 VkSubpassDependency dep = {0,
3505 1,
3506 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3507 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3508 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3509 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3510 VK_DEPENDENCY_BY_REGION_BIT};
3511 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003512 VkRenderPass rp;
3513 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3514 ASSERT_VK_SUCCESS(err);
3515
3516 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003517 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 +13003518 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3519
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003520 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003521 VkFramebuffer fb;
3522 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3523 ASSERT_VK_SUCCESS(err);
3524
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003525 char const *vsSource =
3526 "#version 450\n"
3527 "void main() { gl_Position = vec4(1); }\n";
3528 char const *fsSource =
3529 "#version 450\n"
3530 "layout(location=0) out vec4 color;\n"
3531 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003532
3533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3535 VkPipelineObj pipe(m_device);
3536 pipe.AddColorAttachment();
3537 pipe.AddShader(&vs);
3538 pipe.AddShader(&fs);
3539 VkViewport view_port = {};
3540 m_viewports.push_back(view_port);
3541 pipe.SetViewport(m_viewports);
3542 VkRect2D rect = {};
3543 m_scissors.push_back(rect);
3544 pipe.SetScissor(m_scissors);
3545
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003546 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003547 VkPipelineLayout pl;
3548 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3549 ASSERT_VK_SUCCESS(err);
3550 pipe.CreateVKPipeline(pl, rp);
3551
Tony Barbour552f6c02016-12-21 14:34:07 -07003552 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003553
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003554 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3555 nullptr,
3556 rp,
3557 fb,
3558 {{
3559 0, 0,
3560 },
3561 {32, 32}},
3562 0,
3563 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003564
3565 // subtest 1: bind in the wrong subpass
3566 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3567 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003568 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 +13003569 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3570 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3571 m_errorMonitor->VerifyFound();
3572
3573 vkCmdEndRenderPass(m_commandBuffer->handle());
3574
3575 // subtest 2: bind in correct subpass, then transition to next subpass
3576 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3577 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3578 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003579 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 +13003580 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3581 m_errorMonitor->VerifyFound();
3582
3583 vkCmdEndRenderPass(m_commandBuffer->handle());
3584
Tony Barbour552f6c02016-12-21 14:34:07 -07003585 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003586
3587 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3588 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3589 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3590}
3591
Tony Barbour4e919972016-08-09 13:27:40 -06003592TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003593 TEST_DESCRIPTION(
3594 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3595 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003596 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3600 "Cannot execute a render pass with renderArea "
3601 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003602
3603 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3604 m_renderPassBeginInfo.renderArea.extent.width = 257;
3605 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003606 m_commandBuffer->BeginCommandBuffer();
3607 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003608 m_errorMonitor->VerifyFound();
3609}
3610
3611TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003612 TEST_DESCRIPTION(
3613 "Generate INDEPENDENT_BLEND by disabling independent "
3614 "blend and then specifying different blend states for two "
3615 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003616 VkPhysicalDeviceFeatures features = {};
3617 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003618 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003619
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3621 "Invalid Pipeline CreateInfo: If independent blend feature not "
3622 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003623
Cody Northropc31a84f2016-08-22 10:41:47 -06003624 VkDescriptorSetObj descriptorSet(m_device);
3625 descriptorSet.AppendDummy();
3626 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003627
Cody Northropc31a84f2016-08-22 10:41:47 -06003628 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003629 // Create a renderPass with two color attachments
3630 VkAttachmentReference attachments[2] = {};
3631 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003632 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3634
3635 VkSubpassDescription subpass = {};
3636 subpass.pColorAttachments = attachments;
3637 subpass.colorAttachmentCount = 2;
3638
3639 VkRenderPassCreateInfo rpci = {};
3640 rpci.subpassCount = 1;
3641 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003642 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003643
Tony Barbourffd60bd2017-03-09 12:04:55 -07003644 VkAttachmentDescription attach_desc[2] = {};
3645 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3646 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3647 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3648 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3649 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3650 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3651 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3652 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003653
Tony Barbourffd60bd2017-03-09 12:04:55 -07003654 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003655 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3656
3657 VkRenderPass renderpass;
3658 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003659 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003660 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003661
Cody Northropc31a84f2016-08-22 10:41:47 -06003662 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3663 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3664 att_state1.blendEnable = VK_TRUE;
3665 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3666 att_state2.blendEnable = VK_FALSE;
3667 pipeline.AddColorAttachment(0, &att_state1);
3668 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003669 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003670 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003671 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003672}
3673
Mike Weiblen40b160e2017-02-06 19:21:52 -07003674// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3675TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3676 TEST_DESCRIPTION(
3677 "Create a graphics pipeline that is incompatible with the requirements "
3678 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003679 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003680
3681 VkDescriptorSetObj ds_obj(m_device);
3682 ds_obj.AppendDummy();
3683 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3684
3685 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3686
3687 VkPipelineColorBlendAttachmentState att_state1 = {};
3688 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3689 att_state1.blendEnable = VK_TRUE;
3690
3691 VkRenderpassObj rp_obj(m_device);
3692
3693 {
3694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3695 VkPipelineObj pipeline(m_device);
3696 pipeline.AddShader(&vs_obj);
3697 pipeline.AddColorAttachment(0, &att_state1);
3698
3699 VkGraphicsPipelineCreateInfo info = {};
3700 pipeline.InitGraphicsPipelineCreateInfo(&info);
3701 info.pColorBlendState = nullptr;
3702
3703 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3704 m_errorMonitor->VerifyFound();
3705 }
3706}
3707
Cort Stratton7547f772017-05-04 15:18:52 -07003708TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003709 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003710 "Ensure that CreateRenderPass produces the expected validation errors "
3711 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003712
Tony Barbour1fa09702017-03-16 12:09:08 -06003713 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003714
Cort Stratton7547f772017-05-04 15:18:52 -07003715 std::vector<VkAttachmentDescription> attachments = {
3716 // input attachments
3717 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3718 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3719 VK_IMAGE_LAYOUT_GENERAL},
3720 // color attachments
3721 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3722 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3723 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3724 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3725 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3726 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3727 // depth attachment
3728 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3729 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3730 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3731 // resolve attachment
3732 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3733 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3734 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3735 // preserve attachments
3736 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3737 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3738 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3739 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003740
Cort Stratton7547f772017-05-04 15:18:52 -07003741 std::vector<VkAttachmentReference> input = {
3742 {0, VK_IMAGE_LAYOUT_GENERAL},
3743 };
3744 std::vector<VkAttachmentReference> color = {
3745 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3746 };
3747 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3748 std::vector<VkAttachmentReference> resolve = {
3749 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3750 };
3751 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003752
Cort Stratton7547f772017-05-04 15:18:52 -07003753 VkSubpassDescription subpass = {0,
3754 VK_PIPELINE_BIND_POINT_GRAPHICS,
3755 (uint32_t)input.size(),
3756 input.data(),
3757 (uint32_t)color.size(),
3758 color.data(),
3759 resolve.data(),
3760 &depth,
3761 (uint32_t)preserve.size(),
3762 preserve.data()};
3763
3764 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3765 nullptr,
3766 0,
3767 (uint32_t)attachments.size(),
3768 attachments.data(),
3769 1,
3770 &subpass,
3771 0,
3772 nullptr};
3773
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003774 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003775 VkResult err;
3776 // Test too many color attachments
3777 {
3778 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3779 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3780 subpass.pColorAttachments = too_many_colors.data();
3781 subpass.pResolveAttachments = NULL;
3782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3783 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3784 m_errorMonitor->VerifyFound();
3785 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3786 subpass.colorAttachmentCount = (uint32_t)color.size();
3787 subpass.pColorAttachments = color.data();
3788 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003789 }
Cort Stratton7547f772017-05-04 15:18:52 -07003790 // Test sample count mismatch between color buffers
3791 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003794 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003796 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3797 // Test sample count mismatch between color buffers and depth buffer
3798 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3800 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003801 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003802 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003803 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3804 // Test resolve attachment with UNUSED color attachment
3805 color[0].attachment = VK_ATTACHMENT_UNUSED;
3806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3807 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003808 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003809 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003810 color[0].attachment = 1;
3811 // Test resolve from a single-sampled color attachment
3812 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3813 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3815 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3816 m_errorMonitor->VerifyFound();
3817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3818 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3819 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3820 // Test resolve to a multi-sampled resolve attachment
3821 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3823 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3824 m_errorMonitor->VerifyFound();
3825 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3826 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3827 // Test with color/resolve format mismatch
3828 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3830 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3831 m_errorMonitor->VerifyFound();
3832 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3833 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3834 // Test for UNUSED preserve attachments
3835 preserve[0] = VK_ATTACHMENT_UNUSED;
3836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3837 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3838 m_errorMonitor->VerifyFound();
3839 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3840 preserve[0] = 5;
3841 // Test for preserve attachments used elsewhere in the subpass
3842 color[0].attachment = preserve[0];
3843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3844 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3845 m_errorMonitor->VerifyFound();
3846 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3847 color[0].attachment = 1;
3848 // test for layout mismatch between input attachment and color attachment
3849 input[0].attachment = color[0].attachment;
3850 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3852 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3853 m_errorMonitor->VerifyFound();
3854 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3855 input[0].attachment = 0;
3856 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3857 // test for layout mismatch between input attachment and depth attachment
3858 input[0].attachment = depth.attachment;
3859 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3861 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3862 m_errorMonitor->VerifyFound();
3863 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3864 input[0].attachment = 0;
3865 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3866 // Test for attachment used first as input with loadOp=CLEAR
3867 {
3868 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3869 subpasses[0].inputAttachmentCount = 0;
3870 subpasses[1].inputAttachmentCount = 0;
3871 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3872 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3873 nullptr,
3874 0,
3875 (uint32_t)attachments.size(),
3876 attachments.data(),
3877 (uint32_t)subpasses.size(),
3878 subpasses.data(),
3879 0,
3880 nullptr};
3881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3882 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3883 m_errorMonitor->VerifyFound();
3884 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3885 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3886 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003887}
3888
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003889TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003890 TEST_DESCRIPTION(
3891 "Hit errors when attempting to create a framebuffer :\n"
3892 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3893 " 2. Use a color image as depthStencil attachment\n"
3894 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3895 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3896 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3897 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003898 " 7. Framebuffer attachment where dimensions don't match\n"
3899 " 8. Framebuffer attachment w/o identity swizzle\n"
3900 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901
Tony Barbour1fa09702017-03-16 12:09:08 -06003902 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003903 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3904
Cort Stratton8133ec22017-04-27 16:25:03 +02003905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003906
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003907 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 VkAttachmentReference attach = {};
3909 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3910 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003911 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003912 VkRenderPassCreateInfo rpci = {};
3913 rpci.subpassCount = 1;
3914 rpci.pSubpasses = &subpass;
3915 rpci.attachmentCount = 1;
3916 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003918 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003919 rpci.pAttachments = &attach_desc;
3920 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3921 VkRenderPass rp;
3922 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003925 VkImageView ivs[2];
3926 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3927 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003928 VkFramebufferCreateInfo fb_info = {};
3929 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3930 fb_info.pNext = NULL;
3931 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003932 // Set mis-matching attachmentCount
3933 fb_info.attachmentCount = 2;
3934 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003935 fb_info.width = 100;
3936 fb_info.height = 100;
3937 fb_info.layers = 1;
3938
3939 VkFramebuffer fb;
3940 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3941
3942 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003943 if (err == VK_SUCCESS) {
3944 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3945 }
3946 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003947
3948 // Create a renderPass with a depth-stencil attachment created with
3949 // IMAGE_USAGE_COLOR_ATTACHMENT
3950 // Add our color attachment to pDepthStencilAttachment
3951 subpass.pDepthStencilAttachment = &attach;
3952 subpass.pColorAttachments = NULL;
3953 VkRenderPass rp_ds;
3954 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3955 ASSERT_VK_SUCCESS(err);
3956 // Set correct attachment count, but attachment has COLOR usage bit set
3957 fb_info.attachmentCount = 1;
3958 fb_info.renderPass = rp_ds;
3959
Cort Stratton8133ec22017-04-27 16:25:03 +02003960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003961 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3962
3963 m_errorMonitor->VerifyFound();
3964 if (err == VK_SUCCESS) {
3965 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3966 }
3967 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003968
3969 // Create new renderpass with alternate attachment format from fb
3970 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3971 subpass.pDepthStencilAttachment = NULL;
3972 subpass.pColorAttachments = &attach;
3973 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3974 ASSERT_VK_SUCCESS(err);
3975
3976 // Cause error due to mis-matched formats between rp & fb
3977 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3978 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003980 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3981
3982 m_errorMonitor->VerifyFound();
3983 if (err == VK_SUCCESS) {
3984 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3985 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003986 vkDestroyRenderPass(m_device->device(), rp, NULL);
3987
3988 // Create new renderpass with alternate sample count from fb
3989 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3990 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3991 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3992 ASSERT_VK_SUCCESS(err);
3993
3994 // Cause error due to mis-matched sample count between rp & fb
3995 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003997 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3998
3999 m_errorMonitor->VerifyFound();
4000 if (err == VK_SUCCESS) {
4001 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4002 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004003
4004 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with 2 mip levels.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create a image view with two mip levels.
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 // Set level count to 2 (only 1 is allowed for FB attachment)
4022 ivci.subresourceRange.levelCount = 2;
4023 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4024 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4025 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004026
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004027 // Re-create renderpass to have matching sample count
4028 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4029 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4030 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004031
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004032 fb_info.renderPass = rp;
4033 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02004034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004035 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4036
4037 m_errorMonitor->VerifyFound();
4038 if (err == VK_SUCCESS) {
4039 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4040 }
4041 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004042 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004043
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004044 // Update view to original color buffer and grow FB dimensions too big
4045 fb_info.pAttachments = ivs;
4046 fb_info.height = 1024;
4047 fb_info.width = 1024;
4048 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02004049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004050 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4051
4052 m_errorMonitor->VerifyFound();
4053 if (err == VK_SUCCESS) {
4054 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4055 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004056
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004057 {
4058 // Create an image with one mip level.
4059 VkImageObj image(m_device);
4060 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4061 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004062
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004063 // Create view attachment with non-identity swizzle
4064 VkImageView view;
4065 VkImageViewCreateInfo ivci = {};
4066 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4067 ivci.image = image.handle();
4068 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4069 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4070 ivci.subresourceRange.layerCount = 1;
4071 ivci.subresourceRange.baseMipLevel = 0;
4072 ivci.subresourceRange.levelCount = 1;
4073 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4074 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4075 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4076 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4077 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4078 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4079 ASSERT_VK_SUCCESS(err);
4080
4081 fb_info.pAttachments = &view;
4082 fb_info.height = 100;
4083 fb_info.width = 100;
4084 fb_info.layers = 1;
4085
Cort Stratton8133ec22017-04-27 16:25:03 +02004086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004087 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4088
4089 m_errorMonitor->VerifyFound();
4090 if (err == VK_SUCCESS) {
4091 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4092 }
4093 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004094 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004095
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 // reset attachment to color attachment
4097 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004098
4099 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004100 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004101 fb_info.height = 100;
4102 fb_info.layers = 1;
4103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004106 m_errorMonitor->VerifyFound();
4107 if (err == VK_SUCCESS) {
4108 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4109 }
4110 // and width=0
4111 fb_info.width = 0;
4112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4113 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004114 m_errorMonitor->VerifyFound();
4115 if (err == VK_SUCCESS) {
4116 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4117 }
4118
4119 // Request fb that exceeds max height
4120 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004121 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004122 fb_info.layers = 1;
4123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004125 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004126 m_errorMonitor->VerifyFound();
4127 if (err == VK_SUCCESS) {
4128 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4129 }
4130 // and height=0
4131 fb_info.height = 0;
4132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4133 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004134 m_errorMonitor->VerifyFound();
4135 if (err == VK_SUCCESS) {
4136 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4137 }
4138
4139 // Request fb that exceeds max layers
4140 fb_info.width = 100;
4141 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004142 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004145 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004146 m_errorMonitor->VerifyFound();
4147 if (err == VK_SUCCESS) {
4148 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4149 }
4150 // and layers=0
4151 fb_info.layers = 0;
4152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4153 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004154 m_errorMonitor->VerifyFound();
4155 if (err == VK_SUCCESS) {
4156 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4157 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004158
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004159 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004160}
4161
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004162TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004163 TEST_DESCRIPTION(
4164 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4165 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004166
Tony Barbour1fa09702017-03-16 12:09:08 -06004167 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004168 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Line Width dynamic "
4177 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004180 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4182 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004183 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004184}
4185
4186TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004187 TEST_DESCRIPTION(
4188 "Run a simple draw calls to validate failure when Viewport dynamic "
4189 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004190
Tony Barbour1fa09702017-03-16 12:09:08 -06004191 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004192 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4194 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004195 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004196 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004197}
4198
4199TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004200 TEST_DESCRIPTION(
4201 "Run a simple draw calls to validate failure when Scissor dynamic "
4202 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004203
Tony Barbour1fa09702017-03-16 12:09:08 -06004204 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004205 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4207 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004208 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004209 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004210}
4211
Cortd713fe82016-07-27 09:51:27 -07004212TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004213 TEST_DESCRIPTION(
4214 "Run a simple draw calls to validate failure when Blend Constants "
4215 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004216
Tony Barbour1fa09702017-03-16 12:09:08 -06004217 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004218 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4220 "Dynamic blend constants state not set for this command buffer");
4221 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004222 m_errorMonitor->VerifyFound();
4223}
4224
4225TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004226 TEST_DESCRIPTION(
4227 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4228 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004229
Tony Barbour1fa09702017-03-16 12:09:08 -06004230 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004231 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004232 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004233 return;
4234 }
4235 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4237 "Dynamic depth bounds state not set for this command buffer");
4238 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004239 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004240}
4241
4242TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004243 TEST_DESCRIPTION(
4244 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4245 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004246
Tony Barbour1fa09702017-03-16 12:09:08 -06004247 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004248 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4250 "Dynamic stencil read mask state not set for this command buffer");
4251 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004252 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004253}
4254
4255TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004256 TEST_DESCRIPTION(
4257 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4258 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004259
Tony Barbour1fa09702017-03-16 12:09:08 -06004260 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004261 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4263 "Dynamic stencil write mask state not set for this command buffer");
4264 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004265 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004266}
4267
4268TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004269 TEST_DESCRIPTION(
4270 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4271 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004272
Tony Barbour1fa09702017-03-16 12:09:08 -06004273 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004274 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4276 "Dynamic stencil reference state not set for this command buffer");
4277 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004278 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004279}
4280
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004281TEST_F(VkLayerTest, IndexBufferNotBound) {
4282 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4286 "Index buffer object not bound to this command buffer when Indexed ");
4287 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004288 m_errorMonitor->VerifyFound();
4289}
4290
Karl Schultz6addd812016-02-02 17:17:23 -07004291TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4293 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4294 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004295
Tony Barbour1fa09702017-03-16 12:09:08 -06004296 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004297 ASSERT_NO_FATAL_FAILURE(InitViewport());
4298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4299
Karl Schultz6addd812016-02-02 17:17:23 -07004300 // We luck out b/c by default the framework creates CB w/ the
4301 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004302 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004303 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004304 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004305
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004306 // Bypass framework since it does the waits automatically
4307 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004308 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004309 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4310 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004311 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004312 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004313 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004314 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004315 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004316 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004317 submit_info.pSignalSemaphores = NULL;
4318
Chris Forbes40028e22016-06-13 09:59:34 +12004319 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004320 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004321 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004322
Karl Schultz6addd812016-02-02 17:17:23 -07004323 // Cause validation error by re-submitting cmd buffer that should only be
4324 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004325 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004326 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004328 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004329}
4330
Karl Schultz6addd812016-02-02 17:17:23 -07004331TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004332 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004333 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004334
Tony Barbour1fa09702017-03-16 12:09:08 -06004335 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004337
Karl Schultz6addd812016-02-02 17:17:23 -07004338 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4339 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004340 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004341 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004342 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004343
4344 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004345 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4346 ds_pool_ci.pNext = NULL;
4347 ds_pool_ci.flags = 0;
4348 ds_pool_ci.maxSets = 1;
4349 ds_pool_ci.poolSizeCount = 1;
4350 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004351
4352 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004353 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004354 ASSERT_VK_SUCCESS(err);
4355
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004356 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4357 dsl_binding_samp.binding = 0;
4358 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4359 dsl_binding_samp.descriptorCount = 1;
4360 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4361 dsl_binding_samp.pImmutableSamplers = NULL;
4362
4363 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4364 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4365 ds_layout_ci.pNext = NULL;
4366 ds_layout_ci.bindingCount = 1;
4367 ds_layout_ci.pBindings = &dsl_binding_samp;
4368
4369 VkDescriptorSetLayout ds_layout_samp;
4370 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4371 ASSERT_VK_SUCCESS(err);
4372
4373 // Try to allocate 2 sets when pool only has 1 set
4374 VkDescriptorSet descriptor_sets[2];
4375 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4376 VkDescriptorSetAllocateInfo alloc_info = {};
4377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4378 alloc_info.descriptorSetCount = 2;
4379 alloc_info.descriptorPool = ds_pool;
4380 alloc_info.pSetLayouts = set_layouts;
4381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4382 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4383 m_errorMonitor->VerifyFound();
4384
4385 alloc_info.descriptorSetCount = 1;
4386 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004388 dsl_binding.binding = 0;
4389 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4390 dsl_binding.descriptorCount = 1;
4391 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4392 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004393
Karl Schultz6addd812016-02-02 17:17:23 -07004394 ds_layout_ci.bindingCount = 1;
4395 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004396
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004397 VkDescriptorSetLayout ds_layout_ub;
4398 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004399 ASSERT_VK_SUCCESS(err);
4400
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004401 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004402 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004403 alloc_info.pSetLayouts = &ds_layout_ub;
4404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4405 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004406
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004407 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004408
Karl Schultz2825ab92016-12-02 08:23:14 -07004409 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004410 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004411 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004412}
4413
Karl Schultz6addd812016-02-02 17:17:23 -07004414TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4415 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004416
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004418
Tony Barbour1fa09702017-03-16 12:09:08 -06004419 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004421
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004422 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004423 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4424 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004425
4426 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004427 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4428 ds_pool_ci.pNext = NULL;
4429 ds_pool_ci.maxSets = 1;
4430 ds_pool_ci.poolSizeCount = 1;
4431 ds_pool_ci.flags = 0;
4432 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4433 // app can only call vkResetDescriptorPool on this pool.;
4434 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004435
4436 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004437 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004438 ASSERT_VK_SUCCESS(err);
4439
4440 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004441 dsl_binding.binding = 0;
4442 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4443 dsl_binding.descriptorCount = 1;
4444 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4445 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004446
4447 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004448 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4449 ds_layout_ci.pNext = NULL;
4450 ds_layout_ci.bindingCount = 1;
4451 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004452
4453 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004454 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004455 ASSERT_VK_SUCCESS(err);
4456
4457 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004458 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004459 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004460 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004461 alloc_info.descriptorPool = ds_pool;
4462 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004463 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004464 ASSERT_VK_SUCCESS(err);
4465
4466 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004467 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004468
Chia-I Wuf7458c52015-10-26 21:10:41 +08004469 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004471}
4472
Karl Schultz6addd812016-02-02 17:17:23 -07004473TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004474 // Attempt to clear Descriptor Pool with bad object.
4475 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004476
Tony Barbour1fa09702017-03-16 12:09:08 -06004477 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004479 uint64_t fake_pool_handle = 0xbaad6001;
4480 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4481 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004483}
4484
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004485TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004486 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4487 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004488 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004489 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004490
4491 uint64_t fake_set_handle = 0xbaad6001;
4492 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004493 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004495
Tony Barbour1fa09702017-03-16 12:09:08 -06004496 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004497
4498 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4499 layout_bindings[0].binding = 0;
4500 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4501 layout_bindings[0].descriptorCount = 1;
4502 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4503 layout_bindings[0].pImmutableSamplers = NULL;
4504
4505 VkDescriptorSetLayout descriptor_set_layout;
4506 VkDescriptorSetLayoutCreateInfo dslci = {};
4507 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4508 dslci.pNext = NULL;
4509 dslci.bindingCount = 1;
4510 dslci.pBindings = layout_bindings;
4511 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004512 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004513
4514 VkPipelineLayout pipeline_layout;
4515 VkPipelineLayoutCreateInfo plci = {};
4516 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4517 plci.pNext = NULL;
4518 plci.setLayoutCount = 1;
4519 plci.pSetLayouts = &descriptor_set_layout;
4520 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004521 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004522
Tony Barbour552f6c02016-12-21 14:34:07 -07004523 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004524 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4525 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004526 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004527 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004528 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4529 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004530}
4531
Karl Schultz6addd812016-02-02 17:17:23 -07004532TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004533 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4534 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004535 uint64_t fake_layout_handle = 0xbaad6001;
4536 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004538 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004539 VkPipelineLayout pipeline_layout;
4540 VkPipelineLayoutCreateInfo plci = {};
4541 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4542 plci.pNext = NULL;
4543 plci.setLayoutCount = 1;
4544 plci.pSetLayouts = &bad_layout;
4545 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4546
4547 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004548}
4549
Mark Muellerd4914412016-06-13 17:52:06 -06004550TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004551 TEST_DESCRIPTION(
4552 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4553 "1) A uniform buffer update must have a valid buffer index."
4554 "2) When using an array of descriptors in a single WriteDescriptor,"
4555 " the descriptor types and stageflags must all be the same."
4556 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004557
Mike Weiblena6666382017-01-05 15:16:11 -07004558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004559
Tony Barbour1fa09702017-03-16 12:09:08 -06004560 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004561 VkDescriptorPoolSize ds_type_count[4] = {};
4562 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4563 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004564 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004565 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004566 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004567 ds_type_count[2].descriptorCount = 1;
4568 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4569 ds_type_count[3].descriptorCount = 1;
4570
4571 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4572 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4573 ds_pool_ci.maxSets = 1;
4574 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4575 ds_pool_ci.pPoolSizes = ds_type_count;
4576
4577 VkDescriptorPool ds_pool;
4578 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4579 ASSERT_VK_SUCCESS(err);
4580
Mark Muellerb9896722016-06-16 09:54:29 -06004581 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004582 layout_binding[0].binding = 0;
4583 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4584 layout_binding[0].descriptorCount = 1;
4585 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4586 layout_binding[0].pImmutableSamplers = NULL;
4587
4588 layout_binding[1].binding = 1;
4589 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4590 layout_binding[1].descriptorCount = 1;
4591 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4592 layout_binding[1].pImmutableSamplers = NULL;
4593
4594 VkSamplerCreateInfo sampler_ci = {};
4595 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4596 sampler_ci.pNext = NULL;
4597 sampler_ci.magFilter = VK_FILTER_NEAREST;
4598 sampler_ci.minFilter = VK_FILTER_NEAREST;
4599 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4600 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4601 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4602 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4603 sampler_ci.mipLodBias = 1.0;
4604 sampler_ci.anisotropyEnable = VK_FALSE;
4605 sampler_ci.maxAnisotropy = 1;
4606 sampler_ci.compareEnable = VK_FALSE;
4607 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4608 sampler_ci.minLod = 1.0;
4609 sampler_ci.maxLod = 1.0;
4610 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4611 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4612 VkSampler sampler;
4613
4614 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4615 ASSERT_VK_SUCCESS(err);
4616
4617 layout_binding[2].binding = 2;
4618 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4619 layout_binding[2].descriptorCount = 1;
4620 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4621 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4622
Mark Muellerd4914412016-06-13 17:52:06 -06004623 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4624 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4625 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4626 ds_layout_ci.pBindings = layout_binding;
4627 VkDescriptorSetLayout ds_layout;
4628 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4629 ASSERT_VK_SUCCESS(err);
4630
4631 VkDescriptorSetAllocateInfo alloc_info = {};
4632 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4633 alloc_info.descriptorSetCount = 1;
4634 alloc_info.descriptorPool = ds_pool;
4635 alloc_info.pSetLayouts = &ds_layout;
4636 VkDescriptorSet descriptorSet;
4637 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4638 ASSERT_VK_SUCCESS(err);
4639
4640 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4641 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4642 pipeline_layout_ci.pNext = NULL;
4643 pipeline_layout_ci.setLayoutCount = 1;
4644 pipeline_layout_ci.pSetLayouts = &ds_layout;
4645
4646 VkPipelineLayout pipeline_layout;
4647 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4648 ASSERT_VK_SUCCESS(err);
4649
Mark Mueller5c838ce2016-06-16 09:54:29 -06004650 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004651 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4652 descriptor_write.dstSet = descriptorSet;
4653 descriptor_write.dstBinding = 0;
4654 descriptor_write.descriptorCount = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004658 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4659 m_errorMonitor->VerifyFound();
4660
4661 // Create a buffer to update the descriptor with
4662 uint32_t qfi = 0;
4663 VkBufferCreateInfo buffCI = {};
4664 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4665 buffCI.size = 1024;
4666 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4667 buffCI.queueFamilyIndexCount = 1;
4668 buffCI.pQueueFamilyIndices = &qfi;
4669
4670 VkBuffer dyub;
4671 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4672 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004673
Tony Barboure132c5f2016-12-12 11:50:20 -07004674 VkDeviceMemory mem;
4675 VkMemoryRequirements mem_reqs;
4676 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4677
4678 VkMemoryAllocateInfo mem_alloc_info = {};
4679 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4680 mem_alloc_info.allocationSize = mem_reqs.size;
4681 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4682 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4683 ASSERT_VK_SUCCESS(err);
4684
4685 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4686 ASSERT_VK_SUCCESS(err);
4687
4688 VkDescriptorBufferInfo buffInfo[2] = {};
4689 buffInfo[0].buffer = dyub;
4690 buffInfo[0].offset = 0;
4691 buffInfo[0].range = 1024;
4692 buffInfo[1].buffer = dyub;
4693 buffInfo[1].offset = 0;
4694 buffInfo[1].range = 1024;
4695 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004696 descriptor_write.descriptorCount = 2;
4697
Mark Mueller5c838ce2016-06-16 09:54:29 -06004698 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004700 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4701 m_errorMonitor->VerifyFound();
4702
Mark Mueller5c838ce2016-06-16 09:54:29 -06004703 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4704 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004705 descriptor_write.dstBinding = 1;
4706 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004707
Mark Mueller5c838ce2016-06-16 09:54:29 -06004708 // Make pImageInfo index non-null to avoid complaints of it missing
4709 VkDescriptorImageInfo imageInfo = {};
4710 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4711 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004713 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4714 m_errorMonitor->VerifyFound();
4715
Mark Muellerd4914412016-06-13 17:52:06 -06004716 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004717 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004718 vkDestroySampler(m_device->device(), sampler, NULL);
4719 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4722}
4723
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004725 TEST_DESCRIPTION(
4726 "Attempt to draw with a command buffer that is invalid "
4727 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004729
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004730 VkBuffer buffer;
4731 VkDeviceMemory mem;
4732 VkMemoryRequirements mem_reqs;
4733
4734 VkBufferCreateInfo buf_info = {};
4735 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004736 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004737 buf_info.size = 256;
4738 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4739 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4740 ASSERT_VK_SUCCESS(err);
4741
4742 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4743
4744 VkMemoryAllocateInfo alloc_info = {};
4745 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4746 alloc_info.allocationSize = 256;
4747 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004748 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 -06004749 if (!pass) {
4750 vkDestroyBuffer(m_device->device(), buffer, NULL);
4751 return;
4752 }
4753 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4754 ASSERT_VK_SUCCESS(err);
4755
4756 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4757 ASSERT_VK_SUCCESS(err);
4758
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004759 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004760 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004761 m_commandBuffer->EndCommandBuffer();
4762
Mark Lobodzinski33826372017-04-13 11:10:11 -06004763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004764 // Destroy buffer dependency prior to submit to cause ERROR
4765 vkDestroyBuffer(m_device->device(), buffer, NULL);
4766
4767 VkSubmitInfo submit_info = {};
4768 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4769 submit_info.commandBufferCount = 1;
4770 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4771 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4772
4773 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004774 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004775 vkFreeMemory(m_device->handle(), mem, NULL);
4776}
4777
Tobin Ehlisea413442016-09-28 10:23:59 -06004778TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4779 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4780
Tony Barbour1fa09702017-03-16 12:09:08 -06004781 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4783
4784 VkDescriptorPoolSize ds_type_count;
4785 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4786 ds_type_count.descriptorCount = 1;
4787
4788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4790 ds_pool_ci.maxSets = 1;
4791 ds_pool_ci.poolSizeCount = 1;
4792 ds_pool_ci.pPoolSizes = &ds_type_count;
4793
4794 VkDescriptorPool ds_pool;
4795 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4796 ASSERT_VK_SUCCESS(err);
4797
4798 VkDescriptorSetLayoutBinding layout_binding;
4799 layout_binding.binding = 0;
4800 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4801 layout_binding.descriptorCount = 1;
4802 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4803 layout_binding.pImmutableSamplers = NULL;
4804
4805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4807 ds_layout_ci.bindingCount = 1;
4808 ds_layout_ci.pBindings = &layout_binding;
4809 VkDescriptorSetLayout ds_layout;
4810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4811 ASSERT_VK_SUCCESS(err);
4812
4813 VkDescriptorSetAllocateInfo alloc_info = {};
4814 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4815 alloc_info.descriptorSetCount = 1;
4816 alloc_info.descriptorPool = ds_pool;
4817 alloc_info.pSetLayouts = &ds_layout;
4818 VkDescriptorSet descriptor_set;
4819 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4820 ASSERT_VK_SUCCESS(err);
4821
4822 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4823 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4824 pipeline_layout_ci.pNext = NULL;
4825 pipeline_layout_ci.setLayoutCount = 1;
4826 pipeline_layout_ci.pSetLayouts = &ds_layout;
4827
4828 VkPipelineLayout pipeline_layout;
4829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4830 ASSERT_VK_SUCCESS(err);
4831
4832 VkBuffer buffer;
4833 uint32_t queue_family_index = 0;
4834 VkBufferCreateInfo buffer_create_info = {};
4835 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4836 buffer_create_info.size = 1024;
4837 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4838 buffer_create_info.queueFamilyIndexCount = 1;
4839 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4840
4841 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4842 ASSERT_VK_SUCCESS(err);
4843
4844 VkMemoryRequirements memory_reqs;
4845 VkDeviceMemory buffer_memory;
4846
4847 VkMemoryAllocateInfo memory_info = {};
4848 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4849 memory_info.allocationSize = 0;
4850 memory_info.memoryTypeIndex = 0;
4851
4852 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4853 memory_info.allocationSize = memory_reqs.size;
4854 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4855 ASSERT_TRUE(pass);
4856
4857 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4858 ASSERT_VK_SUCCESS(err);
4859 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4860 ASSERT_VK_SUCCESS(err);
4861
4862 VkBufferView view;
4863 VkBufferViewCreateInfo bvci = {};
4864 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4865 bvci.buffer = buffer;
Tobin Ehliscc980e12017-05-19 12:05:49 -06004866 bvci.format = VK_FORMAT_R32_SFLOAT;
Tobin Ehlisea413442016-09-28 10:23:59 -06004867 bvci.range = VK_WHOLE_SIZE;
4868
4869 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4870 ASSERT_VK_SUCCESS(err);
4871
4872 VkWriteDescriptorSet descriptor_write = {};
4873 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4874 descriptor_write.dstSet = descriptor_set;
4875 descriptor_write.dstBinding = 0;
4876 descriptor_write.descriptorCount = 1;
4877 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4878 descriptor_write.pTexelBufferView = &view;
4879
4880 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4881
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004882 char const *vsSource =
4883 "#version 450\n"
4884 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004885 "void main(){\n"
4886 " gl_Position = vec4(1);\n"
4887 "}\n";
4888 char const *fsSource =
4889 "#version 450\n"
4890 "\n"
Tobin Ehliscc980e12017-05-19 12:05:49 -06004891 "layout(set=0, binding=0, r32f) uniform imageBuffer s;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 "layout(location=0) out vec4 x;\n"
4893 "void main(){\n"
4894 " x = imageLoad(s, 0);\n"
4895 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004896 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4897 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4898 VkPipelineObj pipe(m_device);
4899 pipe.AddShader(&vs);
4900 pipe.AddShader(&fs);
4901 pipe.AddColorAttachment();
4902 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4903
Mark Lobodzinski33826372017-04-13 11:10:11 -06004904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004905
Tony Barbour552f6c02016-12-21 14:34:07 -07004906 m_commandBuffer->BeginCommandBuffer();
4907 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4908
Tobin Ehlisea413442016-09-28 10:23:59 -06004909 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4910 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4911 VkRect2D scissor = {{0, 0}, {16, 16}};
4912 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4913 // Bind pipeline to cmd buffer
4914 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4915 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4916 &descriptor_set, 0, nullptr);
4917 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004918 m_commandBuffer->EndRenderPass();
4919 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004920
4921 // Delete BufferView in order to invalidate cmd buffer
4922 vkDestroyBufferView(m_device->device(), view, NULL);
4923 // Now attempt submit of cmd buffer
4924 VkSubmitInfo submit_info = {};
4925 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4926 submit_info.commandBufferCount = 1;
4927 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4928 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4929 m_errorMonitor->VerifyFound();
4930
4931 // Clean-up
4932 vkDestroyBuffer(m_device->device(), buffer, NULL);
4933 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4934 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4935 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4936 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4937}
4938
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004939TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004940 TEST_DESCRIPTION(
4941 "Attempt to draw with a command buffer that is invalid "
4942 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004943 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004944
4945 VkImage image;
4946 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4947 VkImageCreateInfo image_create_info = {};
4948 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4949 image_create_info.pNext = NULL;
4950 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4951 image_create_info.format = tex_format;
4952 image_create_info.extent.width = 32;
4953 image_create_info.extent.height = 32;
4954 image_create_info.extent.depth = 1;
4955 image_create_info.mipLevels = 1;
4956 image_create_info.arrayLayers = 1;
4957 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4958 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004959 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004960 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004962 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004963 // Have to bind memory to image before recording cmd in cmd buffer using it
4964 VkMemoryRequirements mem_reqs;
4965 VkDeviceMemory image_mem;
4966 bool pass;
4967 VkMemoryAllocateInfo mem_alloc = {};
4968 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4969 mem_alloc.pNext = NULL;
4970 mem_alloc.memoryTypeIndex = 0;
4971 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4972 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004973 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004974 ASSERT_TRUE(pass);
4975 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4976 ASSERT_VK_SUCCESS(err);
4977 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4978 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004979
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004980 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004981 VkClearColorValue ccv;
4982 ccv.float32[0] = 1.0f;
4983 ccv.float32[1] = 1.0f;
4984 ccv.float32[2] = 1.0f;
4985 ccv.float32[3] = 1.0f;
4986 VkImageSubresourceRange isr = {};
4987 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004988 isr.baseArrayLayer = 0;
4989 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004990 isr.layerCount = 1;
4991 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004992 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004993 m_commandBuffer->EndCommandBuffer();
4994
Mark Lobodzinski33826372017-04-13 11:10:11 -06004995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004996 // Destroy image dependency prior to submit to cause ERROR
4997 vkDestroyImage(m_device->device(), image, NULL);
4998
4999 VkSubmitInfo submit_info = {};
5000 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5001 submit_info.commandBufferCount = 1;
5002 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5003 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5004
5005 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06005006 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06005007}
5008
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005009TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005010 TEST_DESCRIPTION(
5011 "Attempt to draw with a command buffer that is invalid "
5012 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005013 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005014 VkFormatProperties format_properties;
5015 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005016 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5017 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 return;
5019 }
5020
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5022
5023 VkImageCreateInfo image_ci = {};
5024 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5025 image_ci.pNext = NULL;
5026 image_ci.imageType = VK_IMAGE_TYPE_2D;
5027 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5028 image_ci.extent.width = 32;
5029 image_ci.extent.height = 32;
5030 image_ci.extent.depth = 1;
5031 image_ci.mipLevels = 1;
5032 image_ci.arrayLayers = 1;
5033 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5034 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005035 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005036 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5037 image_ci.flags = 0;
5038 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005039 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005040
5041 VkMemoryRequirements memory_reqs;
5042 VkDeviceMemory image_memory;
5043 bool pass;
5044 VkMemoryAllocateInfo memory_info = {};
5045 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5046 memory_info.pNext = NULL;
5047 memory_info.allocationSize = 0;
5048 memory_info.memoryTypeIndex = 0;
5049 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5050 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005051 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005052 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005053 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005054 ASSERT_VK_SUCCESS(err);
5055 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5056 ASSERT_VK_SUCCESS(err);
5057
5058 VkImageViewCreateInfo ivci = {
5059 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5060 nullptr,
5061 0,
5062 image,
5063 VK_IMAGE_VIEW_TYPE_2D,
5064 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005065 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005066 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5067 };
5068 VkImageView view;
5069 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5070 ASSERT_VK_SUCCESS(err);
5071
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005072 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005073 VkFramebuffer fb;
5074 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5075 ASSERT_VK_SUCCESS(err);
5076
5077 // Just use default renderpass with our framebuffer
5078 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005079 m_renderPassBeginInfo.renderArea.extent.width = 32;
5080 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005081 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005082 m_commandBuffer->BeginCommandBuffer();
5083 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5084 m_commandBuffer->EndRenderPass();
5085 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005086 // Destroy image attached to framebuffer to invalidate cmd buffer
5087 vkDestroyImage(m_device->device(), image, NULL);
5088 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005090 QueueCommandBuffer(false);
5091 m_errorMonitor->VerifyFound();
5092
5093 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5094 vkDestroyImageView(m_device->device(), view, nullptr);
5095 vkFreeMemory(m_device->device(), image_memory, nullptr);
5096}
5097
Tobin Ehlisb329f992016-10-12 13:20:29 -06005098TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5099 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005100 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005101 VkFormatProperties format_properties;
5102 VkResult err = VK_SUCCESS;
5103 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5104
Tobin Ehlisb329f992016-10-12 13:20:29 -06005105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5106
5107 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005108 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 -06005109 ASSERT_TRUE(image.initialized());
5110 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5111
5112 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5113 VkFramebuffer fb;
5114 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5115 ASSERT_VK_SUCCESS(err);
5116
5117 // Just use default renderpass with our framebuffer
5118 m_renderPassBeginInfo.framebuffer = fb;
5119 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005120 m_commandBuffer->BeginCommandBuffer();
5121 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5122 m_commandBuffer->EndRenderPass();
5123 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005124 // Submit cmd buffer to put it in-flight
5125 VkSubmitInfo submit_info = {};
5126 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5127 submit_info.commandBufferCount = 1;
5128 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5129 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5130 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005132 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5133 m_errorMonitor->VerifyFound();
5134 // Wait for queue to complete so we can safely destroy everything
5135 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005136 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5137 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005138 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5139}
5140
Tobin Ehlis88becd72016-09-21 14:33:41 -06005141TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5142 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005143 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005144 VkFormatProperties format_properties;
5145 VkResult err = VK_SUCCESS;
5146 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005147
Tobin Ehlis88becd72016-09-21 14:33:41 -06005148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5149
5150 VkImageCreateInfo image_ci = {};
5151 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5152 image_ci.pNext = NULL;
5153 image_ci.imageType = VK_IMAGE_TYPE_2D;
5154 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5155 image_ci.extent.width = 256;
5156 image_ci.extent.height = 256;
5157 image_ci.extent.depth = 1;
5158 image_ci.mipLevels = 1;
5159 image_ci.arrayLayers = 1;
5160 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5161 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005162 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5164 image_ci.flags = 0;
5165 VkImage image;
5166 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5167
5168 VkMemoryRequirements memory_reqs;
5169 VkDeviceMemory image_memory;
5170 bool pass;
5171 VkMemoryAllocateInfo memory_info = {};
5172 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5173 memory_info.pNext = NULL;
5174 memory_info.allocationSize = 0;
5175 memory_info.memoryTypeIndex = 0;
5176 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5177 memory_info.allocationSize = memory_reqs.size;
5178 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5179 ASSERT_TRUE(pass);
5180 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5181 ASSERT_VK_SUCCESS(err);
5182 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5183 ASSERT_VK_SUCCESS(err);
5184
5185 VkImageViewCreateInfo ivci = {
5186 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5187 nullptr,
5188 0,
5189 image,
5190 VK_IMAGE_VIEW_TYPE_2D,
5191 VK_FORMAT_B8G8R8A8_UNORM,
5192 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5193 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5194 };
5195 VkImageView view;
5196 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5197 ASSERT_VK_SUCCESS(err);
5198
5199 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5200 VkFramebuffer fb;
5201 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5202 ASSERT_VK_SUCCESS(err);
5203
5204 // Just use default renderpass with our framebuffer
5205 m_renderPassBeginInfo.framebuffer = fb;
5206 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005207 m_commandBuffer->BeginCommandBuffer();
5208 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5209 m_commandBuffer->EndRenderPass();
5210 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005211 // Submit cmd buffer to put it (and attached imageView) in-flight
5212 VkSubmitInfo submit_info = {};
5213 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5214 submit_info.commandBufferCount = 1;
5215 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5216 // Submit cmd buffer to put framebuffer and children in-flight
5217 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5218 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005220 vkDestroyImage(m_device->device(), image, NULL);
5221 m_errorMonitor->VerifyFound();
5222 // Wait for queue to complete so we can safely destroy image and other objects
5223 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005224 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5225 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005226 vkDestroyImage(m_device->device(), image, NULL);
5227 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5228 vkDestroyImageView(m_device->device(), view, nullptr);
5229 vkFreeMemory(m_device->device(), image_memory, nullptr);
5230}
5231
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005232TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5233 TEST_DESCRIPTION("Delete in-use renderPass.");
5234
Tony Barbour1fa09702017-03-16 12:09:08 -06005235 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5237
5238 // Create simple renderpass
5239 VkAttachmentReference attach = {};
5240 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5241 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005242 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005243 subpass.pColorAttachments = &attach;
5244 VkRenderPassCreateInfo rpci = {};
5245 rpci.subpassCount = 1;
5246 rpci.pSubpasses = &subpass;
5247 rpci.attachmentCount = 1;
5248 VkAttachmentDescription attach_desc = {};
5249 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5250 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5251 rpci.pAttachments = &attach_desc;
5252 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5253 VkRenderPass rp;
5254 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5255 ASSERT_VK_SUCCESS(err);
5256
5257 // Create a pipeline that uses the given renderpass
5258 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5259 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5260
5261 VkPipelineLayout pipeline_layout;
5262 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5263 ASSERT_VK_SUCCESS(err);
5264
5265 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5266 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5267 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005268 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005269 vp_state_ci.pViewports = &vp;
5270 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005271 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005272 vp_state_ci.pScissors = &scissors;
5273
5274 VkPipelineShaderStageCreateInfo shaderStages[2];
5275 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5276
5277 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005278 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 -06005279 // but add it to be able to run on more devices
5280 shaderStages[0] = vs.GetStageCreateInfo();
5281 shaderStages[1] = fs.GetStageCreateInfo();
5282
5283 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5284 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5285
5286 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5287 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5288 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5289
5290 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5291 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5292 rs_ci.rasterizerDiscardEnable = true;
5293 rs_ci.lineWidth = 1.0f;
5294
5295 VkPipelineColorBlendAttachmentState att = {};
5296 att.blendEnable = VK_FALSE;
5297 att.colorWriteMask = 0xf;
5298
5299 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5300 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5301 cb_ci.attachmentCount = 1;
5302 cb_ci.pAttachments = &att;
5303
5304 VkGraphicsPipelineCreateInfo gp_ci = {};
5305 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5306 gp_ci.stageCount = 2;
5307 gp_ci.pStages = shaderStages;
5308 gp_ci.pVertexInputState = &vi_ci;
5309 gp_ci.pInputAssemblyState = &ia_ci;
5310 gp_ci.pViewportState = &vp_state_ci;
5311 gp_ci.pRasterizationState = &rs_ci;
5312 gp_ci.pColorBlendState = &cb_ci;
5313 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5314 gp_ci.layout = pipeline_layout;
5315 gp_ci.renderPass = rp;
5316
5317 VkPipelineCacheCreateInfo pc_ci = {};
5318 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5319
Dave Houlton756e6742017-03-23 14:33:22 -06005320 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005321 VkPipeline pipeline;
5322 VkPipelineCache pipe_cache;
5323 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5324 ASSERT_VK_SUCCESS(err);
5325
5326 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5327 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005328
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005329 // Bind pipeline to cmd buffer, will also bind renderpass
5330 m_commandBuffer->BeginCommandBuffer();
5331 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5332 m_commandBuffer->EndCommandBuffer();
5333
5334 VkSubmitInfo submit_info = {};
5335 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5336 submit_info.commandBufferCount = 1;
5337 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5338 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005339 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005340
5341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5342 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5343 m_errorMonitor->VerifyFound();
5344
5345 // Wait for queue to complete so we can safely destroy everything
5346 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005347 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005348 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005349 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5350 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5351 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5352 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5353}
5354
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005355TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005356 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005357 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005358
5359 VkImage image;
5360 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5361 VkImageCreateInfo image_create_info = {};
5362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5363 image_create_info.pNext = NULL;
5364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5365 image_create_info.format = tex_format;
5366 image_create_info.extent.width = 32;
5367 image_create_info.extent.height = 32;
5368 image_create_info.extent.depth = 1;
5369 image_create_info.mipLevels = 1;
5370 image_create_info.arrayLayers = 1;
5371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5372 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005373 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005375 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005376 ASSERT_VK_SUCCESS(err);
5377 // Have to bind memory to image before recording cmd in cmd buffer using it
5378 VkMemoryRequirements mem_reqs;
5379 VkDeviceMemory image_mem;
5380 bool pass;
5381 VkMemoryAllocateInfo mem_alloc = {};
5382 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5383 mem_alloc.pNext = NULL;
5384 mem_alloc.memoryTypeIndex = 0;
5385 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5386 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005387 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005388 ASSERT_TRUE(pass);
5389 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5390 ASSERT_VK_SUCCESS(err);
5391
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005392 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005394 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005395
5396 m_commandBuffer->BeginCommandBuffer();
5397 VkClearColorValue ccv;
5398 ccv.float32[0] = 1.0f;
5399 ccv.float32[1] = 1.0f;
5400 ccv.float32[2] = 1.0f;
5401 ccv.float32[3] = 1.0f;
5402 VkImageSubresourceRange isr = {};
5403 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5404 isr.baseArrayLayer = 0;
5405 isr.baseMipLevel = 0;
5406 isr.layerCount = 1;
5407 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005408 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 m_commandBuffer->EndCommandBuffer();
5410
5411 m_errorMonitor->VerifyFound();
5412 vkDestroyImage(m_device->device(), image, NULL);
5413 vkFreeMemory(m_device->device(), image_mem, nullptr);
5414}
5415
5416TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005417 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005418 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005419
5420 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005421 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 -06005422 VK_IMAGE_TILING_OPTIMAL, 0);
5423 ASSERT_TRUE(image.initialized());
5424
5425 VkBuffer buffer;
5426 VkDeviceMemory mem;
5427 VkMemoryRequirements mem_reqs;
5428
5429 VkBufferCreateInfo buf_info = {};
5430 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005431 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005432 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005433 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5434 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5435 ASSERT_VK_SUCCESS(err);
5436
5437 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5438
5439 VkMemoryAllocateInfo alloc_info = {};
5440 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005441 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005442 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005443 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 -06005444 if (!pass) {
5445 vkDestroyBuffer(m_device->device(), buffer, NULL);
5446 return;
5447 }
5448 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5449 ASSERT_VK_SUCCESS(err);
5450
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005451 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005453 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005454 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005455 region.bufferRowLength = 16;
5456 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005457 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5458
5459 region.imageSubresource.layerCount = 1;
5460 region.imageExtent.height = 4;
5461 region.imageExtent.width = 4;
5462 region.imageExtent.depth = 1;
5463 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005464 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5465 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005466 m_commandBuffer->EndCommandBuffer();
5467
5468 m_errorMonitor->VerifyFound();
5469
5470 vkDestroyBuffer(m_device->device(), buffer, NULL);
5471 vkFreeMemory(m_device->handle(), mem, NULL);
5472}
5473
Tobin Ehlis85940f52016-07-07 16:57:21 -06005474TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005475 TEST_DESCRIPTION(
5476 "Attempt to draw with a command buffer that is invalid "
5477 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005478 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005479
5480 VkEvent event;
5481 VkEventCreateInfo evci = {};
5482 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5483 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5484 ASSERT_VK_SUCCESS(result);
5485
5486 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005487 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005488 m_commandBuffer->EndCommandBuffer();
5489
Mark Lobodzinski33826372017-04-13 11:10:11 -06005490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005491 // Destroy event dependency prior to submit to cause ERROR
5492 vkDestroyEvent(m_device->device(), event, NULL);
5493
5494 VkSubmitInfo submit_info = {};
5495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5496 submit_info.commandBufferCount = 1;
5497 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5498 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5499
5500 m_errorMonitor->VerifyFound();
5501}
5502
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005503TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005504 TEST_DESCRIPTION(
5505 "Attempt to draw with a command buffer that is invalid "
5506 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005507 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005508
5509 VkQueryPool query_pool;
5510 VkQueryPoolCreateInfo qpci{};
5511 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5512 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5513 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005515 ASSERT_VK_SUCCESS(result);
5516
5517 m_commandBuffer->BeginCommandBuffer();
5518 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5519 m_commandBuffer->EndCommandBuffer();
5520
Mark Lobodzinski33826372017-04-13 11:10:11 -06005521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005522 // Destroy query pool dependency prior to submit to cause ERROR
5523 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5524
5525 VkSubmitInfo submit_info = {};
5526 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5527 submit_info.commandBufferCount = 1;
5528 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5529 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5530
5531 m_errorMonitor->VerifyFound();
5532}
5533
Tobin Ehlis24130d92016-07-08 15:50:53 -06005534TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005535 TEST_DESCRIPTION(
5536 "Attempt to draw with a command buffer that is invalid "
5537 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005538 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5540
5541 VkResult err;
5542
5543 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5544 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5545
5546 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005547 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005548 ASSERT_VK_SUCCESS(err);
5549
5550 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5551 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5552 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005553 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005554 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005555 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005556 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005557 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005558
5559 VkPipelineShaderStageCreateInfo shaderStages[2];
5560 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005563 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 -06005564 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005565 shaderStages[0] = vs.GetStageCreateInfo();
5566 shaderStages[1] = fs.GetStageCreateInfo();
5567
5568 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5569 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5570
5571 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5572 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5573 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5574
5575 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5576 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005577 rs_ci.rasterizerDiscardEnable = true;
5578 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005579
5580 VkPipelineColorBlendAttachmentState att = {};
5581 att.blendEnable = VK_FALSE;
5582 att.colorWriteMask = 0xf;
5583
5584 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5585 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5586 cb_ci.attachmentCount = 1;
5587 cb_ci.pAttachments = &att;
5588
5589 VkGraphicsPipelineCreateInfo gp_ci = {};
5590 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5591 gp_ci.stageCount = 2;
5592 gp_ci.pStages = shaderStages;
5593 gp_ci.pVertexInputState = &vi_ci;
5594 gp_ci.pInputAssemblyState = &ia_ci;
5595 gp_ci.pViewportState = &vp_state_ci;
5596 gp_ci.pRasterizationState = &rs_ci;
5597 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005598 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5599 gp_ci.layout = pipeline_layout;
5600 gp_ci.renderPass = renderPass();
5601
5602 VkPipelineCacheCreateInfo pc_ci = {};
5603 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5604
5605 VkPipeline pipeline;
5606 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005607 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005608 ASSERT_VK_SUCCESS(err);
5609
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005610 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005611 ASSERT_VK_SUCCESS(err);
5612
5613 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005614 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005615 m_commandBuffer->EndCommandBuffer();
5616 // Now destroy pipeline in order to cause error when submitting
5617 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5618
Mark Lobodzinski33826372017-04-13 11:10:11 -06005619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005620
5621 VkSubmitInfo submit_info = {};
5622 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5623 submit_info.commandBufferCount = 1;
5624 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5625 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5626
5627 m_errorMonitor->VerifyFound();
5628 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5629 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5630}
5631
Tobin Ehlis31289162016-08-17 14:57:58 -06005632TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005633 TEST_DESCRIPTION(
5634 "Attempt to draw with a command buffer that is invalid "
5635 "due to a bound descriptor set with a buffer dependency "
5636 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005637 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005638 ASSERT_NO_FATAL_FAILURE(InitViewport());
5639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5640
5641 VkDescriptorPoolSize ds_type_count = {};
5642 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5643 ds_type_count.descriptorCount = 1;
5644
5645 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5646 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5647 ds_pool_ci.pNext = NULL;
5648 ds_pool_ci.maxSets = 1;
5649 ds_pool_ci.poolSizeCount = 1;
5650 ds_pool_ci.pPoolSizes = &ds_type_count;
5651
5652 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005653 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005654 ASSERT_VK_SUCCESS(err);
5655
5656 VkDescriptorSetLayoutBinding dsl_binding = {};
5657 dsl_binding.binding = 0;
5658 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5659 dsl_binding.descriptorCount = 1;
5660 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5661 dsl_binding.pImmutableSamplers = NULL;
5662
5663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5665 ds_layout_ci.pNext = NULL;
5666 ds_layout_ci.bindingCount = 1;
5667 ds_layout_ci.pBindings = &dsl_binding;
5668 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005669 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005670 ASSERT_VK_SUCCESS(err);
5671
5672 VkDescriptorSet descriptorSet;
5673 VkDescriptorSetAllocateInfo alloc_info = {};
5674 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5675 alloc_info.descriptorSetCount = 1;
5676 alloc_info.descriptorPool = ds_pool;
5677 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005678 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005679 ASSERT_VK_SUCCESS(err);
5680
5681 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5682 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5683 pipeline_layout_ci.pNext = NULL;
5684 pipeline_layout_ci.setLayoutCount = 1;
5685 pipeline_layout_ci.pSetLayouts = &ds_layout;
5686
5687 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005688 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005689 ASSERT_VK_SUCCESS(err);
5690
5691 // Create a buffer to update the descriptor with
5692 uint32_t qfi = 0;
5693 VkBufferCreateInfo buffCI = {};
5694 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5695 buffCI.size = 1024;
5696 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5697 buffCI.queueFamilyIndexCount = 1;
5698 buffCI.pQueueFamilyIndices = &qfi;
5699
5700 VkBuffer buffer;
5701 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5702 ASSERT_VK_SUCCESS(err);
5703 // Allocate memory and bind to buffer so we can make it to the appropriate
5704 // error
5705 VkMemoryAllocateInfo mem_alloc = {};
5706 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5707 mem_alloc.pNext = NULL;
5708 mem_alloc.allocationSize = 1024;
5709 mem_alloc.memoryTypeIndex = 0;
5710
5711 VkMemoryRequirements memReqs;
5712 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005713 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005714 if (!pass) {
5715 vkDestroyBuffer(m_device->device(), buffer, NULL);
5716 return;
5717 }
5718
5719 VkDeviceMemory mem;
5720 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5721 ASSERT_VK_SUCCESS(err);
5722 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5723 ASSERT_VK_SUCCESS(err);
5724 // Correctly update descriptor to avoid "NOT_UPDATED" error
5725 VkDescriptorBufferInfo buffInfo = {};
5726 buffInfo.buffer = buffer;
5727 buffInfo.offset = 0;
5728 buffInfo.range = 1024;
5729
5730 VkWriteDescriptorSet descriptor_write;
5731 memset(&descriptor_write, 0, sizeof(descriptor_write));
5732 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5733 descriptor_write.dstSet = descriptorSet;
5734 descriptor_write.dstBinding = 0;
5735 descriptor_write.descriptorCount = 1;
5736 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5737 descriptor_write.pBufferInfo = &buffInfo;
5738
5739 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5740
5741 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005742 char const *vsSource =
5743 "#version 450\n"
5744 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005745 "void main(){\n"
5746 " gl_Position = vec4(1);\n"
5747 "}\n";
5748 char const *fsSource =
5749 "#version 450\n"
5750 "\n"
5751 "layout(location=0) out vec4 x;\n"
5752 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5753 "void main(){\n"
5754 " x = vec4(bar.y);\n"
5755 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005756 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5757 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5758 VkPipelineObj pipe(m_device);
5759 pipe.AddShader(&vs);
5760 pipe.AddShader(&fs);
5761 pipe.AddColorAttachment();
5762 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5763
Tony Barbour552f6c02016-12-21 14:34:07 -07005764 m_commandBuffer->BeginCommandBuffer();
5765 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005766 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5767 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5768 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005769
5770 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5771 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5772
Tobin Ehlis31289162016-08-17 14:57:58 -06005773 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005774 m_commandBuffer->EndRenderPass();
5775 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005777 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5778 vkDestroyBuffer(m_device->device(), buffer, NULL);
5779 // Attempt to submit cmd buffer
5780 VkSubmitInfo submit_info = {};
5781 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5782 submit_info.commandBufferCount = 1;
5783 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5784 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5785 m_errorMonitor->VerifyFound();
5786 // Cleanup
5787 vkFreeMemory(m_device->device(), mem, NULL);
5788
5789 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5790 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5791 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5792}
5793
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005794TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005795 TEST_DESCRIPTION(
5796 "Attempt to draw with a command buffer that is invalid "
5797 "due to a bound descriptor sets with a combined image "
5798 "sampler having their image, sampler, and descriptor set "
5799 "each respectively destroyed and then attempting to "
5800 "submit associated cmd buffers. Attempt to destroy a "
5801 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005802 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005803 ASSERT_NO_FATAL_FAILURE(InitViewport());
5804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5805
5806 VkDescriptorPoolSize ds_type_count = {};
5807 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5808 ds_type_count.descriptorCount = 1;
5809
5810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5812 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005813 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005814 ds_pool_ci.maxSets = 1;
5815 ds_pool_ci.poolSizeCount = 1;
5816 ds_pool_ci.pPoolSizes = &ds_type_count;
5817
5818 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005819 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005820 ASSERT_VK_SUCCESS(err);
5821
5822 VkDescriptorSetLayoutBinding dsl_binding = {};
5823 dsl_binding.binding = 0;
5824 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5825 dsl_binding.descriptorCount = 1;
5826 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5827 dsl_binding.pImmutableSamplers = NULL;
5828
5829 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5830 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5831 ds_layout_ci.pNext = NULL;
5832 ds_layout_ci.bindingCount = 1;
5833 ds_layout_ci.pBindings = &dsl_binding;
5834 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005835 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005836 ASSERT_VK_SUCCESS(err);
5837
5838 VkDescriptorSet descriptorSet;
5839 VkDescriptorSetAllocateInfo alloc_info = {};
5840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5841 alloc_info.descriptorSetCount = 1;
5842 alloc_info.descriptorPool = ds_pool;
5843 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005844 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005845 ASSERT_VK_SUCCESS(err);
5846
5847 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5848 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5849 pipeline_layout_ci.pNext = NULL;
5850 pipeline_layout_ci.setLayoutCount = 1;
5851 pipeline_layout_ci.pSetLayouts = &ds_layout;
5852
5853 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005854 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005855 ASSERT_VK_SUCCESS(err);
5856
5857 // Create images to update the descriptor with
5858 VkImage image;
5859 VkImage image2;
5860 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5861 const int32_t tex_width = 32;
5862 const int32_t tex_height = 32;
5863 VkImageCreateInfo image_create_info = {};
5864 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5865 image_create_info.pNext = NULL;
5866 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5867 image_create_info.format = tex_format;
5868 image_create_info.extent.width = tex_width;
5869 image_create_info.extent.height = tex_height;
5870 image_create_info.extent.depth = 1;
5871 image_create_info.mipLevels = 1;
5872 image_create_info.arrayLayers = 1;
5873 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5874 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5875 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5876 image_create_info.flags = 0;
5877 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5878 ASSERT_VK_SUCCESS(err);
5879 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5880 ASSERT_VK_SUCCESS(err);
5881
5882 VkMemoryRequirements memory_reqs;
5883 VkDeviceMemory image_memory;
5884 bool pass;
5885 VkMemoryAllocateInfo memory_info = {};
5886 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5887 memory_info.pNext = NULL;
5888 memory_info.allocationSize = 0;
5889 memory_info.memoryTypeIndex = 0;
5890 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5891 // Allocate enough memory for both images
5892 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005893 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005894 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005895 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005896 ASSERT_VK_SUCCESS(err);
5897 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5898 ASSERT_VK_SUCCESS(err);
5899 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005900 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005901 ASSERT_VK_SUCCESS(err);
5902
5903 VkImageViewCreateInfo image_view_create_info = {};
5904 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5905 image_view_create_info.image = image;
5906 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5907 image_view_create_info.format = tex_format;
5908 image_view_create_info.subresourceRange.layerCount = 1;
5909 image_view_create_info.subresourceRange.baseMipLevel = 0;
5910 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005911 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005912
5913 VkImageView view;
5914 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005915 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005916 ASSERT_VK_SUCCESS(err);
5917 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005918 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005919 ASSERT_VK_SUCCESS(err);
5920 // Create Samplers
5921 VkSamplerCreateInfo sampler_ci = {};
5922 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5923 sampler_ci.pNext = NULL;
5924 sampler_ci.magFilter = VK_FILTER_NEAREST;
5925 sampler_ci.minFilter = VK_FILTER_NEAREST;
5926 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5927 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5928 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5929 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5930 sampler_ci.mipLodBias = 1.0;
5931 sampler_ci.anisotropyEnable = VK_FALSE;
5932 sampler_ci.maxAnisotropy = 1;
5933 sampler_ci.compareEnable = VK_FALSE;
5934 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5935 sampler_ci.minLod = 1.0;
5936 sampler_ci.maxLod = 1.0;
5937 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5938 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5939 VkSampler sampler;
5940 VkSampler sampler2;
5941 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5942 ASSERT_VK_SUCCESS(err);
5943 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5944 ASSERT_VK_SUCCESS(err);
5945 // Update descriptor with image and sampler
5946 VkDescriptorImageInfo img_info = {};
5947 img_info.sampler = sampler;
5948 img_info.imageView = view;
5949 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5950
5951 VkWriteDescriptorSet descriptor_write;
5952 memset(&descriptor_write, 0, sizeof(descriptor_write));
5953 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5954 descriptor_write.dstSet = descriptorSet;
5955 descriptor_write.dstBinding = 0;
5956 descriptor_write.descriptorCount = 1;
5957 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5958 descriptor_write.pImageInfo = &img_info;
5959
5960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5961
5962 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005963 char const *vsSource =
5964 "#version 450\n"
5965 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005966 "void main(){\n"
5967 " gl_Position = vec4(1);\n"
5968 "}\n";
5969 char const *fsSource =
5970 "#version 450\n"
5971 "\n"
5972 "layout(set=0, binding=0) uniform sampler2D s;\n"
5973 "layout(location=0) out vec4 x;\n"
5974 "void main(){\n"
5975 " x = texture(s, vec2(1));\n"
5976 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5979 VkPipelineObj pipe(m_device);
5980 pipe.AddShader(&vs);
5981 pipe.AddShader(&fs);
5982 pipe.AddColorAttachment();
5983 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5984
5985 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005987 m_commandBuffer->BeginCommandBuffer();
5988 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005989 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5990 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5991 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005992 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5993 VkRect2D scissor = {{0, 0}, {16, 16}};
5994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5995 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005996 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005997 m_commandBuffer->EndRenderPass();
5998 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 // Destroy sampler invalidates the cmd buffer, causing error on submit
6000 vkDestroySampler(m_device->device(), sampler, NULL);
6001 // Attempt to submit cmd buffer
6002 VkSubmitInfo submit_info = {};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6007 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006008
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006009 // Now re-update descriptor with valid sampler and delete image
6010 img_info.sampler = sampler2;
6011 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006012
6013 VkCommandBufferBeginInfo info = {};
6014 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6015 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6016
Mark Lobodzinski33826372017-04-13 11:10:11 -06006017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006018 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006020 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6022 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006023 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6024 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006026 m_commandBuffer->EndRenderPass();
6027 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006028 // Destroy image invalidates the cmd buffer, causing error on submit
6029 vkDestroyImage(m_device->device(), image, NULL);
6030 // Attempt to submit cmd buffer
6031 submit_info = {};
6032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6033 submit_info.commandBufferCount = 1;
6034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6036 m_errorMonitor->VerifyFound();
6037 // Now update descriptor to be valid, but then free descriptor
6038 img_info.imageView = view2;
6039 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006040 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006041 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006042 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6044 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6046 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006047 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006048 m_commandBuffer->EndRenderPass();
6049 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006050 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006051
6052 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006054 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006055 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006056
6057 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006058 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006059 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006060 m_errorMonitor->SetUnexpectedError(
6061 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6062 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006063 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006064 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6065
6066 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006067 submit_info = {};
6068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6069 submit_info.commandBufferCount = 1;
6070 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006072 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6073 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006074
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006075 // Cleanup
6076 vkFreeMemory(m_device->device(), image_memory, NULL);
6077 vkDestroySampler(m_device->device(), sampler2, NULL);
6078 vkDestroyImage(m_device->device(), image2, NULL);
6079 vkDestroyImageView(m_device->device(), view, NULL);
6080 vkDestroyImageView(m_device->device(), view2, NULL);
6081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6082 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6083 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6084}
6085
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006086TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6087 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6088 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6089 ASSERT_NO_FATAL_FAILURE(InitViewport());
6090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6091
6092 VkDescriptorPoolSize ds_type_count = {};
6093 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6094 ds_type_count.descriptorCount = 1;
6095
6096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6098 ds_pool_ci.pNext = NULL;
6099 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6100 ds_pool_ci.maxSets = 1;
6101 ds_pool_ci.poolSizeCount = 1;
6102 ds_pool_ci.pPoolSizes = &ds_type_count;
6103
6104 VkDescriptorPool ds_pool;
6105 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6106 ASSERT_VK_SUCCESS(err);
6107
6108 VkDescriptorSetLayoutBinding dsl_binding = {};
6109 dsl_binding.binding = 0;
6110 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6111 dsl_binding.descriptorCount = 1;
6112 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6113 dsl_binding.pImmutableSamplers = NULL;
6114
6115 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6116 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6117 ds_layout_ci.pNext = NULL;
6118 ds_layout_ci.bindingCount = 1;
6119 ds_layout_ci.pBindings = &dsl_binding;
6120 VkDescriptorSetLayout ds_layout;
6121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6122 ASSERT_VK_SUCCESS(err);
6123
6124 VkDescriptorSet descriptorSet;
6125 VkDescriptorSetAllocateInfo alloc_info = {};
6126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6127 alloc_info.descriptorSetCount = 1;
6128 alloc_info.descriptorPool = ds_pool;
6129 alloc_info.pSetLayouts = &ds_layout;
6130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6131 ASSERT_VK_SUCCESS(err);
6132
6133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6135 pipeline_layout_ci.pNext = NULL;
6136 pipeline_layout_ci.setLayoutCount = 1;
6137 pipeline_layout_ci.pSetLayouts = &ds_layout;
6138
6139 VkPipelineLayout pipeline_layout;
6140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6141 ASSERT_VK_SUCCESS(err);
6142
6143 // Create images to update the descriptor with
6144 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6145 VkImageObj image(m_device);
6146 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6147 0);
6148 ASSERT_TRUE(image.initialized());
6149
6150 VkImageViewCreateInfo image_view_create_info = {};
6151 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6152 image_view_create_info.image = image.handle();
6153 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6154 image_view_create_info.format = format;
6155 image_view_create_info.subresourceRange.layerCount = 1;
6156 image_view_create_info.subresourceRange.baseMipLevel = 0;
6157 image_view_create_info.subresourceRange.levelCount = 1;
6158 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6159
6160 VkImageView view;
6161 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6162 ASSERT_VK_SUCCESS(err);
6163 // Create Sampler
6164 VkSamplerCreateInfo sampler_ci = {};
6165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6166 sampler_ci.pNext = NULL;
6167 sampler_ci.magFilter = VK_FILTER_NEAREST;
6168 sampler_ci.minFilter = VK_FILTER_NEAREST;
6169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6173 sampler_ci.mipLodBias = 1.0;
6174 sampler_ci.anisotropyEnable = VK_FALSE;
6175 sampler_ci.maxAnisotropy = 1;
6176 sampler_ci.compareEnable = VK_FALSE;
6177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6178 sampler_ci.minLod = 1.0;
6179 sampler_ci.maxLod = 1.0;
6180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6182 VkSampler sampler;
6183 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6184 ASSERT_VK_SUCCESS(err);
6185 // Update descriptor with image and sampler
6186 VkDescriptorImageInfo img_info = {};
6187 img_info.sampler = sampler;
6188 img_info.imageView = view;
6189 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6190 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6191
6192 VkWriteDescriptorSet descriptor_write;
6193 memset(&descriptor_write, 0, sizeof(descriptor_write));
6194 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6195 descriptor_write.dstSet = descriptorSet;
6196 descriptor_write.dstBinding = 0;
6197 descriptor_write.descriptorCount = 1;
6198 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6199 descriptor_write.pImageInfo = &img_info;
6200
6201 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6202
6203 // Create PSO to be used for draw-time errors below
6204 char const *vsSource =
6205 "#version 450\n"
6206 "\n"
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006207 "void main(){\n"
6208 " gl_Position = vec4(1);\n"
6209 "}\n";
6210 char const *fsSource =
6211 "#version 450\n"
6212 "\n"
6213 "layout(set=0, binding=0) uniform sampler2D s;\n"
6214 "layout(location=0) out vec4 x;\n"
6215 "void main(){\n"
6216 " x = texture(s, vec2(1));\n"
6217 "}\n";
6218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6220 VkPipelineObj pipe(m_device);
6221 pipe.AddShader(&vs);
6222 pipe.AddShader(&fs);
6223 pipe.AddColorAttachment();
6224 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6225
6226 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6227 cmd_buf.BeginCommandBuffer();
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006228 // record layout different than actual descriptor layout of SHADER_RO
6229 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06006230 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006231 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6232 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6233 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6234 VkRect2D scissor = {{0, 0}, {16, 16}};
6235 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6236 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6237 // At draw time the update layout will mis-match the actual layout
6238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6239 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6240 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6241 m_errorMonitor->SetDesiredFailureMsg(
6242 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6243 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6244 cmd_buf.Draw(1, 0, 0, 0);
6245 m_errorMonitor->VerifyFound();
6246 cmd_buf.EndRenderPass();
6247 cmd_buf.EndCommandBuffer();
6248 // Submit cmd buffer
6249 VkSubmitInfo submit_info = {};
6250 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6251 submit_info.commandBufferCount = 1;
6252 submit_info.pCommandBuffers = &cmd_buf.handle();
6253 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6254 vkQueueWaitIdle(m_device->m_queue);
6255 // Cleanup
6256 vkDestroySampler(m_device->device(), sampler, NULL);
6257 vkDestroyImageView(m_device->device(), view, NULL);
6258 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6259 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6260 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6261}
6262
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006263TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6264 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006265 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006266 ASSERT_NO_FATAL_FAILURE(InitViewport());
6267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6268
6269 VkDescriptorPoolSize ds_type_count = {};
6270 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6271 ds_type_count.descriptorCount = 1;
6272
6273 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6274 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6275 ds_pool_ci.pNext = NULL;
6276 ds_pool_ci.maxSets = 1;
6277 ds_pool_ci.poolSizeCount = 1;
6278 ds_pool_ci.pPoolSizes = &ds_type_count;
6279
6280 VkDescriptorPool ds_pool;
6281 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6282 ASSERT_VK_SUCCESS(err);
6283
6284 VkDescriptorSetLayoutBinding dsl_binding = {};
6285 dsl_binding.binding = 0;
6286 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6287 dsl_binding.descriptorCount = 1;
6288 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6289 dsl_binding.pImmutableSamplers = NULL;
6290
6291 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6292 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6293 ds_layout_ci.pNext = NULL;
6294 ds_layout_ci.bindingCount = 1;
6295 ds_layout_ci.pBindings = &dsl_binding;
6296 VkDescriptorSetLayout ds_layout;
6297 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6298 ASSERT_VK_SUCCESS(err);
6299
6300 VkDescriptorSet descriptor_set;
6301 VkDescriptorSetAllocateInfo alloc_info = {};
6302 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6303 alloc_info.descriptorSetCount = 1;
6304 alloc_info.descriptorPool = ds_pool;
6305 alloc_info.pSetLayouts = &ds_layout;
6306 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6307 ASSERT_VK_SUCCESS(err);
6308
6309 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6310 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6311 pipeline_layout_ci.pNext = NULL;
6312 pipeline_layout_ci.setLayoutCount = 1;
6313 pipeline_layout_ci.pSetLayouts = &ds_layout;
6314
6315 VkPipelineLayout pipeline_layout;
6316 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6317 ASSERT_VK_SUCCESS(err);
6318
6319 // Create image to update the descriptor with
6320 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006321 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 -06006322 ASSERT_TRUE(image.initialized());
6323
6324 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6325 // Create Sampler
6326 VkSamplerCreateInfo sampler_ci = {};
6327 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6328 sampler_ci.pNext = NULL;
6329 sampler_ci.magFilter = VK_FILTER_NEAREST;
6330 sampler_ci.minFilter = VK_FILTER_NEAREST;
6331 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6332 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6333 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6334 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6335 sampler_ci.mipLodBias = 1.0;
6336 sampler_ci.anisotropyEnable = VK_FALSE;
6337 sampler_ci.maxAnisotropy = 1;
6338 sampler_ci.compareEnable = VK_FALSE;
6339 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6340 sampler_ci.minLod = 1.0;
6341 sampler_ci.maxLod = 1.0;
6342 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6343 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6344 VkSampler sampler;
6345 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6346 ASSERT_VK_SUCCESS(err);
6347 // Update descriptor with image and sampler
6348 VkDescriptorImageInfo img_info = {};
6349 img_info.sampler = sampler;
6350 img_info.imageView = view;
6351 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6352
6353 VkWriteDescriptorSet descriptor_write;
6354 memset(&descriptor_write, 0, sizeof(descriptor_write));
6355 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6356 descriptor_write.dstSet = descriptor_set;
6357 descriptor_write.dstBinding = 0;
6358 descriptor_write.descriptorCount = 1;
6359 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6360 descriptor_write.pImageInfo = &img_info;
6361
6362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6363
6364 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006365 char const *vsSource =
6366 "#version 450\n"
6367 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006368 "void main(){\n"
6369 " gl_Position = vec4(1);\n"
6370 "}\n";
6371 char const *fsSource =
6372 "#version 450\n"
6373 "\n"
6374 "layout(set=0, binding=0) uniform sampler2D s;\n"
6375 "layout(location=0) out vec4 x;\n"
6376 "void main(){\n"
6377 " x = texture(s, vec2(1));\n"
6378 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6381 VkPipelineObj pipe(m_device);
6382 pipe.AddShader(&vs);
6383 pipe.AddShader(&fs);
6384 pipe.AddColorAttachment();
6385 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6386
Tony Barbour552f6c02016-12-21 14:34:07 -07006387 m_commandBuffer->BeginCommandBuffer();
6388 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006389 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6391 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006392
6393 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6394 VkRect2D scissor = {{0, 0}, {16, 16}};
6395 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6396 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6397
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006398 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006399 m_commandBuffer->EndRenderPass();
6400 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006401 // Submit cmd buffer to put pool in-flight
6402 VkSubmitInfo submit_info = {};
6403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6404 submit_info.commandBufferCount = 1;
6405 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6406 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6407 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006409 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6410 m_errorMonitor->VerifyFound();
6411 vkQueueWaitIdle(m_device->m_queue);
6412 // Cleanup
6413 vkDestroySampler(m_device->device(), sampler, NULL);
6414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006416 m_errorMonitor->SetUnexpectedError(
6417 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006418 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006420 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006421}
6422
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006423TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6424 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006426 ASSERT_NO_FATAL_FAILURE(InitViewport());
6427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6428
6429 VkDescriptorPoolSize ds_type_count = {};
6430 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6431 ds_type_count.descriptorCount = 1;
6432
6433 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6434 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6435 ds_pool_ci.pNext = NULL;
6436 ds_pool_ci.maxSets = 1;
6437 ds_pool_ci.poolSizeCount = 1;
6438 ds_pool_ci.pPoolSizes = &ds_type_count;
6439
6440 VkDescriptorPool ds_pool;
6441 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6442 ASSERT_VK_SUCCESS(err);
6443
6444 VkDescriptorSetLayoutBinding dsl_binding = {};
6445 dsl_binding.binding = 0;
6446 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6447 dsl_binding.descriptorCount = 1;
6448 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6449 dsl_binding.pImmutableSamplers = NULL;
6450
6451 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6452 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6453 ds_layout_ci.pNext = NULL;
6454 ds_layout_ci.bindingCount = 1;
6455 ds_layout_ci.pBindings = &dsl_binding;
6456 VkDescriptorSetLayout ds_layout;
6457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6458 ASSERT_VK_SUCCESS(err);
6459
6460 VkDescriptorSet descriptorSet;
6461 VkDescriptorSetAllocateInfo alloc_info = {};
6462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6463 alloc_info.descriptorSetCount = 1;
6464 alloc_info.descriptorPool = ds_pool;
6465 alloc_info.pSetLayouts = &ds_layout;
6466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6467 ASSERT_VK_SUCCESS(err);
6468
6469 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6470 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6471 pipeline_layout_ci.pNext = NULL;
6472 pipeline_layout_ci.setLayoutCount = 1;
6473 pipeline_layout_ci.pSetLayouts = &ds_layout;
6474
6475 VkPipelineLayout pipeline_layout;
6476 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6477 ASSERT_VK_SUCCESS(err);
6478
6479 // Create images to update the descriptor with
6480 VkImage image;
6481 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6482 const int32_t tex_width = 32;
6483 const int32_t tex_height = 32;
6484 VkImageCreateInfo image_create_info = {};
6485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6486 image_create_info.pNext = NULL;
6487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6488 image_create_info.format = tex_format;
6489 image_create_info.extent.width = tex_width;
6490 image_create_info.extent.height = tex_height;
6491 image_create_info.extent.depth = 1;
6492 image_create_info.mipLevels = 1;
6493 image_create_info.arrayLayers = 1;
6494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6495 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6496 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6497 image_create_info.flags = 0;
6498 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6499 ASSERT_VK_SUCCESS(err);
6500 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6501 VkMemoryRequirements memory_reqs;
6502 VkDeviceMemory image_memory;
6503 bool pass;
6504 VkMemoryAllocateInfo memory_info = {};
6505 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6506 memory_info.pNext = NULL;
6507 memory_info.allocationSize = 0;
6508 memory_info.memoryTypeIndex = 0;
6509 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6510 // Allocate enough memory for image
6511 memory_info.allocationSize = memory_reqs.size;
6512 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6513 ASSERT_TRUE(pass);
6514 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6515 ASSERT_VK_SUCCESS(err);
6516 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6517 ASSERT_VK_SUCCESS(err);
6518
6519 VkImageViewCreateInfo image_view_create_info = {};
6520 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6521 image_view_create_info.image = image;
6522 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6523 image_view_create_info.format = tex_format;
6524 image_view_create_info.subresourceRange.layerCount = 1;
6525 image_view_create_info.subresourceRange.baseMipLevel = 0;
6526 image_view_create_info.subresourceRange.levelCount = 1;
6527 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6528
6529 VkImageView view;
6530 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6531 ASSERT_VK_SUCCESS(err);
6532 // Create Samplers
6533 VkSamplerCreateInfo sampler_ci = {};
6534 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6535 sampler_ci.pNext = NULL;
6536 sampler_ci.magFilter = VK_FILTER_NEAREST;
6537 sampler_ci.minFilter = VK_FILTER_NEAREST;
6538 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6539 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6540 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6541 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6542 sampler_ci.mipLodBias = 1.0;
6543 sampler_ci.anisotropyEnable = VK_FALSE;
6544 sampler_ci.maxAnisotropy = 1;
6545 sampler_ci.compareEnable = VK_FALSE;
6546 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6547 sampler_ci.minLod = 1.0;
6548 sampler_ci.maxLod = 1.0;
6549 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6550 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6551 VkSampler sampler;
6552 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6553 ASSERT_VK_SUCCESS(err);
6554 // Update descriptor with image and sampler
6555 VkDescriptorImageInfo img_info = {};
6556 img_info.sampler = sampler;
6557 img_info.imageView = view;
6558 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6559
6560 VkWriteDescriptorSet descriptor_write;
6561 memset(&descriptor_write, 0, sizeof(descriptor_write));
6562 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6563 descriptor_write.dstSet = descriptorSet;
6564 descriptor_write.dstBinding = 0;
6565 descriptor_write.descriptorCount = 1;
6566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6567 descriptor_write.pImageInfo = &img_info;
6568 // Break memory binding and attempt update
6569 vkFreeMemory(m_device->device(), image_memory, nullptr);
6570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006571 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6573 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6575 m_errorMonitor->VerifyFound();
6576 // Cleanup
6577 vkDestroyImage(m_device->device(), image, NULL);
6578 vkDestroySampler(m_device->device(), sampler, NULL);
6579 vkDestroyImageView(m_device->device(), view, NULL);
6580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6581 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6582 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6583}
6584
Karl Schultz6addd812016-02-02 17:17:23 -07006585TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006586 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6587 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006588 // Create a valid cmd buffer
6589 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006590 uint64_t fake_pipeline_handle = 0xbaad6001;
6591 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006596 m_commandBuffer->BeginCommandBuffer();
6597 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006599 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006600
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006601 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006603 Draw(1, 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006605
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006606 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006608 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006611}
6612
Karl Schultz6addd812016-02-02 17:17:23 -07006613TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006614 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006615 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006618
Tony Barbour1fa09702017-03-16 12:09:08 -06006619 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006620 ASSERT_NO_FATAL_FAILURE(InitViewport());
6621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006622 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6624 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006625
6626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6628 ds_pool_ci.pNext = NULL;
6629 ds_pool_ci.maxSets = 1;
6630 ds_pool_ci.poolSizeCount = 1;
6631 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006632
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006633 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006635 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006636
Tony Barboureb254902015-07-15 12:50:33 -06006637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006638 dsl_binding.binding = 0;
6639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6640 dsl_binding.descriptorCount = 1;
6641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006643
Tony Barboureb254902015-07-15 12:50:33 -06006644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6646 ds_layout_ci.pNext = NULL;
6647 ds_layout_ci.bindingCount = 1;
6648 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651 ASSERT_VK_SUCCESS(err);
6652
6653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006656 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006657 alloc_info.descriptorPool = ds_pool;
6658 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006660 ASSERT_VK_SUCCESS(err);
6661
Tony Barboureb254902015-07-15 12:50:33 -06006662 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006663 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6664 pipeline_layout_ci.pNext = NULL;
6665 pipeline_layout_ci.setLayoutCount = 1;
6666 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006667
6668 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670 ASSERT_VK_SUCCESS(err);
6671
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006672 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006673 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006674 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006677 VkPipelineObj pipe(m_device);
6678 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006679 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006680 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006681 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006682
Tony Barbour552f6c02016-12-21 14:34:07 -07006683 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006684 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6686 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006688 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006689
Chia-I Wuf7458c52015-10-26 21:10:41 +08006690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006693}
6694
Karl Schultz6addd812016-02-02 17:17:23 -07006695TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006696 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006697 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006698
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700
Tony Barbour1fa09702017-03-16 12:09:08 -06006701 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6704 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006705
6706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6708 ds_pool_ci.pNext = NULL;
6709 ds_pool_ci.maxSets = 1;
6710 ds_pool_ci.poolSizeCount = 1;
6711 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006712
6713 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006714 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006715 ASSERT_VK_SUCCESS(err);
6716
6717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006718 dsl_binding.binding = 0;
6719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6720 dsl_binding.descriptorCount = 1;
6721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723
6724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6726 ds_layout_ci.pNext = NULL;
6727 ds_layout_ci.bindingCount = 1;
6728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006731 ASSERT_VK_SUCCESS(err);
6732
6733 VkDescriptorSet descriptorSet;
6734 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006736 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 alloc_info.descriptorPool = ds_pool;
6738 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006740 ASSERT_VK_SUCCESS(err);
6741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006742 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 VkWriteDescriptorSet descriptor_write;
6744 memset(&descriptor_write, 0, sizeof(descriptor_write));
6745 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6746 descriptor_write.dstSet = descriptorSet;
6747 descriptor_write.dstBinding = 0;
6748 descriptor_write.descriptorCount = 1;
6749 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6750 descriptor_write.pTexelBufferView = &view;
6751
6752 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6753
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006754 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006755
6756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Mark Youngd339ba32016-05-30 13:28:35 -06006760TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006761 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006762
6763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006766
Tony Barbour1fa09702017-03-16 12:09:08 -06006767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 // Create a buffer with no bound memory and then attempt to create
6770 // a buffer view.
6771 VkBufferCreateInfo buff_ci = {};
6772 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006773 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006774 buff_ci.size = 256;
6775 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6776 VkBuffer buffer;
6777 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 VkBufferViewCreateInfo buff_view_ci = {};
6781 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6782 buff_view_ci.buffer = buffer;
6783 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6784 buff_view_ci.range = VK_WHOLE_SIZE;
6785 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006787
6788 m_errorMonitor->VerifyFound();
6789 vkDestroyBuffer(m_device->device(), buffer, NULL);
6790 // If last error is success, it still created the view, so delete it.
6791 if (err == VK_SUCCESS) {
6792 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6793 }
6794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6797 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6798 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006799 // 1. No dynamicOffset supplied
6800 // 2. Too many dynamicOffsets supplied
6801 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006802 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6804 " requires 1 dynamicOffsets, but only "
6805 "0 dynamicOffsets are left in "
6806 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006807
Tony Barbour1fa09702017-03-16 12:09:08 -06006808 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809 ASSERT_NO_FATAL_FAILURE(InitViewport());
6810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6811
6812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006813 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6814 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815
6816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6818 ds_pool_ci.pNext = NULL;
6819 ds_pool_ci.maxSets = 1;
6820 ds_pool_ci.poolSizeCount = 1;
6821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006822
6823 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006824 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006825 ASSERT_VK_SUCCESS(err);
6826
6827 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006828 dsl_binding.binding = 0;
6829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6830 dsl_binding.descriptorCount = 1;
6831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6832 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006833
6834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6836 ds_layout_ci.pNext = NULL;
6837 ds_layout_ci.bindingCount = 1;
6838 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006841 ASSERT_VK_SUCCESS(err);
6842
6843 VkDescriptorSet descriptorSet;
6844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006846 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 alloc_info.descriptorPool = ds_pool;
6848 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006850 ASSERT_VK_SUCCESS(err);
6851
6852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6854 pipeline_layout_ci.pNext = NULL;
6855 pipeline_layout_ci.setLayoutCount = 1;
6856 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006857
6858 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006860 ASSERT_VK_SUCCESS(err);
6861
6862 // Create a buffer to update the descriptor with
6863 uint32_t qfi = 0;
6864 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006865 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6866 buffCI.size = 1024;
6867 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6868 buffCI.queueFamilyIndexCount = 1;
6869 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006870
6871 VkBuffer dyub;
6872 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006874 // Allocate memory and bind to buffer so we can make it to the appropriate
6875 // error
6876 VkMemoryAllocateInfo mem_alloc = {};
6877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6878 mem_alloc.pNext = NULL;
6879 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006880 mem_alloc.memoryTypeIndex = 0;
6881
6882 VkMemoryRequirements memReqs;
6883 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006885 if (!pass) {
6886 vkDestroyBuffer(m_device->device(), dyub, NULL);
6887 return;
6888 }
6889
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006890 VkDeviceMemory mem;
6891 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6892 ASSERT_VK_SUCCESS(err);
6893 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006895 // Correctly update descriptor to avoid "NOT_UPDATED" error
6896 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006897 buffInfo.buffer = dyub;
6898 buffInfo.offset = 0;
6899 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006900
6901 VkWriteDescriptorSet descriptor_write;
6902 memset(&descriptor_write, 0, sizeof(descriptor_write));
6903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6904 descriptor_write.dstSet = descriptorSet;
6905 descriptor_write.dstBinding = 0;
6906 descriptor_write.descriptorCount = 1;
6907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6908 descriptor_write.pBufferInfo = &buffInfo;
6909
6910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6911
Tony Barbour552f6c02016-12-21 14:34:07 -07006912 m_commandBuffer->BeginCommandBuffer();
6913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006914 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6915 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006916 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006917 uint32_t pDynOff[2] = {512, 756};
6918 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6920 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6921 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6922 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006923 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006924 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 " dynamic offset 512 combined with "
6927 "offset 0 and range 1024 that "
6928 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006930 char const *vsSource =
6931 "#version 450\n"
6932 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006933 "void main(){\n"
6934 " gl_Position = vec4(1);\n"
6935 "}\n";
6936 char const *fsSource =
6937 "#version 450\n"
6938 "\n"
6939 "layout(location=0) out vec4 x;\n"
6940 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6941 "void main(){\n"
6942 " x = vec4(bar.y);\n"
6943 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006944 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6945 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6946 VkPipelineObj pipe(m_device);
6947 pipe.AddShader(&vs);
6948 pipe.AddShader(&fs);
6949 pipe.AddColorAttachment();
6950 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6951
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006952 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6953 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6954 VkRect2D scissor = {{0, 0}, {16, 16}};
6955 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6956
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006957 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006958 // This update should succeed, but offset size of 512 will overstep buffer
6959 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006960 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6961 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006962 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006963 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006964
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006965 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006966 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006967
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006968 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006969 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006970 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6971}
6972
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006973TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006974 TEST_DESCRIPTION(
6975 "Attempt to update a descriptor with a non-sparse buffer "
6976 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006977 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006979 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6981 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006982
Tony Barbour1fa09702017-03-16 12:09:08 -06006983 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006984 ASSERT_NO_FATAL_FAILURE(InitViewport());
6985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6986
6987 VkDescriptorPoolSize ds_type_count = {};
6988 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6989 ds_type_count.descriptorCount = 1;
6990
6991 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6992 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6993 ds_pool_ci.pNext = NULL;
6994 ds_pool_ci.maxSets = 1;
6995 ds_pool_ci.poolSizeCount = 1;
6996 ds_pool_ci.pPoolSizes = &ds_type_count;
6997
6998 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006999 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007000 ASSERT_VK_SUCCESS(err);
7001
7002 VkDescriptorSetLayoutBinding dsl_binding = {};
7003 dsl_binding.binding = 0;
7004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7005 dsl_binding.descriptorCount = 1;
7006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7007 dsl_binding.pImmutableSamplers = NULL;
7008
7009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7011 ds_layout_ci.pNext = NULL;
7012 ds_layout_ci.bindingCount = 1;
7013 ds_layout_ci.pBindings = &dsl_binding;
7014 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007016 ASSERT_VK_SUCCESS(err);
7017
7018 VkDescriptorSet descriptorSet;
7019 VkDescriptorSetAllocateInfo alloc_info = {};
7020 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7021 alloc_info.descriptorSetCount = 1;
7022 alloc_info.descriptorPool = ds_pool;
7023 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007024 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007025 ASSERT_VK_SUCCESS(err);
7026
7027 // Create a buffer to update the descriptor with
7028 uint32_t qfi = 0;
7029 VkBufferCreateInfo buffCI = {};
7030 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7031 buffCI.size = 1024;
7032 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7033 buffCI.queueFamilyIndexCount = 1;
7034 buffCI.pQueueFamilyIndices = &qfi;
7035
7036 VkBuffer dyub;
7037 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7038 ASSERT_VK_SUCCESS(err);
7039
7040 // Attempt to update descriptor without binding memory to it
7041 VkDescriptorBufferInfo buffInfo = {};
7042 buffInfo.buffer = dyub;
7043 buffInfo.offset = 0;
7044 buffInfo.range = 1024;
7045
7046 VkWriteDescriptorSet descriptor_write;
7047 memset(&descriptor_write, 0, sizeof(descriptor_write));
7048 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7049 descriptor_write.dstSet = descriptorSet;
7050 descriptor_write.dstBinding = 0;
7051 descriptor_write.descriptorCount = 1;
7052 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7053 descriptor_write.pBufferInfo = &buffInfo;
7054
7055 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7056 m_errorMonitor->VerifyFound();
7057
7058 vkDestroyBuffer(m_device->device(), dyub, NULL);
7059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7061}
7062
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007063TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007064 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007065 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007066 ASSERT_NO_FATAL_FAILURE(InitViewport());
7067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7068
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007069 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007070 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007071 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7072 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7073 pipeline_layout_ci.pushConstantRangeCount = 1;
7074 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7075
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007076 //
7077 // Check for invalid push constant ranges in pipeline layouts.
7078 //
7079 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007080 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007081 char const *msg;
7082 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007083
Karl Schultzc81037d2016-05-12 08:11:23 -06007084 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7085 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7086 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7087 "vkCreatePipelineLayout() call has push constants index 0 with "
7088 "size 0."},
7089 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7090 "vkCreatePipelineLayout() call has push constants index 0 with "
7091 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007092 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007093 "vkCreatePipelineLayout() call has push constants index 0 with "
7094 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007095 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 0."},
7098 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "offset 1. Offset must"},
7101 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7102 "vkCreatePipelineLayout() call has push constants index 0 "
7103 "with offset "},
7104 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7105 "vkCreatePipelineLayout() call has push constants "
7106 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007107 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007108 "vkCreatePipelineLayout() call has push constants index 0 "
7109 "with offset "},
7110 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7111 "vkCreatePipelineLayout() call has push "
7112 "constants index 0 with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7114 "vkCreatePipelineLayout() call has push "
7115 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007116 }};
7117
7118 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007119 for (const auto &iter : range_tests) {
7120 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7122 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007123 m_errorMonitor->VerifyFound();
7124 if (VK_SUCCESS == err) {
7125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7126 }
7127 }
7128
7129 // Check for invalid stage flag
7130 pc_range.offset = 0;
7131 pc_range.size = 16;
7132 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007133 m_errorMonitor->SetDesiredFailureMsg(
7134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7135 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007137 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007138 if (VK_SUCCESS == err) {
7139 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7140 }
7141
Karl Schultzc59b72d2017-02-24 15:45:05 -07007142 // Check for duplicate stage flags in a list of push constant ranges.
7143 // A shader can only have one push constant block and that block is mapped
7144 // to the push constant range that has that shader's stage flag set.
7145 // The shader's stage flag can only appear once in all the ranges, so the
7146 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007147 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007148 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007149 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007150 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007151 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007152 // Overlapping ranges are OK, but a stage flag can appear only once.
7153 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7154 {
7155 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7156 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7157 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7158 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007159 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007160 {
7161 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7162 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7163 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7164 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7165 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7166 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7167 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7168 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7169 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7171 }},
7172 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7173 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7174 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7175 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7176 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7177 {
7178 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7179 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7180 }},
7181 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7182 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7183 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7184 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7185 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7186 {
7187 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7188 }},
7189 },
7190 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007191
Karl Schultzc59b72d2017-02-24 15:45:05 -07007192 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007194 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007197 m_errorMonitor->VerifyFound();
7198 if (VK_SUCCESS == err) {
7199 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7200 }
7201 }
7202
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007203 //
7204 // CmdPushConstants tests
7205 //
7206
Karl Schultzc59b72d2017-02-24 15:45:05 -07007207 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007208 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007209 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007210 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007211 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007212 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007213 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007214 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007215
7216 const uint8_t dummy_values[100] = {};
7217
7218 m_commandBuffer->BeginCommandBuffer();
7219 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007220
7221 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007222 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007224 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007225 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007226
Karl Schultzc59b72d2017-02-24 15:45:05 -07007227 m_errorMonitor->ExpectSuccess();
7228 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7229 m_errorMonitor->VerifyNotFound();
7230 m_errorMonitor->ExpectSuccess();
7231 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7232 m_errorMonitor->VerifyNotFound();
7233 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7234 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7235 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7236 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7237 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7238 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7239 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007240 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007241 for (const auto &iter : cmd_range_tests) {
7242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7243 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7244 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007245 m_errorMonitor->VerifyFound();
7246 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007247
Tony Barbour552f6c02016-12-21 14:34:07 -07007248 m_commandBuffer->EndRenderPass();
7249 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007250 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007251}
7252
Karl Schultz6addd812016-02-02 17:17:23 -07007253TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007254 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007255 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007256
Tony Barbour1fa09702017-03-16 12:09:08 -06007257 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007258 ASSERT_NO_FATAL_FAILURE(InitViewport());
7259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7260
7261 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7262 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007263 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7264 ds_type_count[0].descriptorCount = 10;
7265 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7266 ds_type_count[1].descriptorCount = 2;
7267 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7268 ds_type_count[2].descriptorCount = 2;
7269 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7270 ds_type_count[3].descriptorCount = 5;
7271 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7272 // type
7273 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7274 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7275 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276
7277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7279 ds_pool_ci.pNext = NULL;
7280 ds_pool_ci.maxSets = 5;
7281 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7282 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007283
7284 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007285 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 ASSERT_VK_SUCCESS(err);
7287
7288 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7289 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007290 dsl_binding[0].binding = 0;
7291 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7292 dsl_binding[0].descriptorCount = 5;
7293 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7294 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007296 // Create layout identical to set0 layout but w/ different stageFlags
7297 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007298 dsl_fs_stage_only.binding = 0;
7299 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7300 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007301 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7302 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007303 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007304 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007305 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7306 ds_layout_ci.pNext = NULL;
7307 ds_layout_ci.bindingCount = 1;
7308 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007309 static const uint32_t NUM_LAYOUTS = 4;
7310 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007311 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007312 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7313 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007315 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007316 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007319 dsl_binding[0].binding = 0;
7320 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007321 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007322 dsl_binding[1].binding = 1;
7323 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7324 dsl_binding[1].descriptorCount = 2;
7325 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7326 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007327 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007328 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007329 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007330 ASSERT_VK_SUCCESS(err);
7331 dsl_binding[0].binding = 0;
7332 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007334 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007336 ASSERT_VK_SUCCESS(err);
7337 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007338 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007339 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007340 ASSERT_VK_SUCCESS(err);
7341
7342 static const uint32_t NUM_SETS = 4;
7343 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7344 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007345 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007346 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007347 alloc_info.descriptorPool = ds_pool;
7348 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007349 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007350 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007351 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007352 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007353 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007355 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007356
7357 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007358 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7359 pipeline_layout_ci.pNext = NULL;
7360 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7361 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
7363 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007364 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007366 // Create pipelineLayout with only one setLayout
7367 pipeline_layout_ci.setLayoutCount = 1;
7368 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007369 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007370 ASSERT_VK_SUCCESS(err);
7371 // Create pipelineLayout with 2 descriptor setLayout at index 0
7372 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7373 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007374 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007375 ASSERT_VK_SUCCESS(err);
7376 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7377 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7378 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007379 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007380 ASSERT_VK_SUCCESS(err);
7381 // Create pipelineLayout with UB type, but stageFlags for FS only
7382 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7383 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007384 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007385 ASSERT_VK_SUCCESS(err);
7386 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7387 VkDescriptorSetLayout pl_bad_s0[2] = {};
7388 pl_bad_s0[0] = ds_layout_fs_only;
7389 pl_bad_s0[1] = ds_layout[1];
7390 pipeline_layout_ci.setLayoutCount = 2;
7391 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7392 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007394 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007395
Tobin Ehlis88452832015-12-03 09:40:56 -07007396 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007397 char const *vsSource =
7398 "#version 450\n"
7399 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007400 "void main(){\n"
7401 " gl_Position = vec4(1);\n"
7402 "}\n";
7403 char const *fsSource =
7404 "#version 450\n"
7405 "\n"
7406 "layout(location=0) out vec4 x;\n"
7407 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7408 "void main(){\n"
7409 " x = vec4(bar.y);\n"
7410 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007413 VkPipelineObj pipe(m_device);
7414 pipe.AddShader(&vs);
7415 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007416 pipe.AddColorAttachment();
7417 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007418
Tony Barbour552f6c02016-12-21 14:34:07 -07007419 m_commandBuffer->BeginCommandBuffer();
7420 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007421
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007422 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007423 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7424 // of PSO
7425 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7426 // cmd_pipeline.c
7427 // due to the fact that cmd_alloc_dset_data() has not been called in
7428 // cmd_bind_graphics_pipeline()
7429 // TODO : Want to cause various binding incompatibility issues here to test
7430 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007431 // First cause various verify_layout_compatibility() fails
7432 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007433 // verify_set_layout_compatibility fail cases:
7434 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007436 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7437 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007438 m_errorMonitor->VerifyFound();
7439
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007440 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7442 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7443 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007444 m_errorMonitor->VerifyFound();
7445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007446 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007447 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7448 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7450 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7451 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007452 m_errorMonitor->VerifyFound();
7453
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007454 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7455 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7457 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7458 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007459 m_errorMonitor->VerifyFound();
7460
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007461 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7462 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7464 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7465 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7466 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007467 m_errorMonitor->VerifyFound();
7468
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007469 // Cause INFO messages due to disturbing previously bound Sets
7470 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7472 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007473 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7475 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7476 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007477 m_errorMonitor->VerifyFound();
7478
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007479 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7480 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007481 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7483 " newly bound as set #0 so set #1 and "
7484 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7486 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007487 m_errorMonitor->VerifyFound();
7488
Tobin Ehlis10fad692016-07-07 12:00:36 -06007489 // Now that we're done actively using the pipelineLayout that gfx pipeline
7490 // was created with, we should be able to delete it. Do that now to verify
7491 // that validation obeys pipelineLayout lifetime
7492 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7493
Tobin Ehlis88452832015-12-03 09:40:56 -07007494 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007495 // 1. Error due to not binding required set (we actually use same code as
7496 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7498 &descriptorSet[0], 0, NULL);
7499 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7500 &descriptorSet[1], 0, NULL);
7501 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 -07007502
7503 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7504 VkRect2D scissor = {{0, 0}, {16, 16}};
7505 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7506 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7507
Tobin Ehlis88452832015-12-03 09:40:56 -07007508 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007509 m_errorMonitor->VerifyFound();
7510
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007511 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007512 // 2. Error due to bound set not being compatible with PSO's
7513 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007514 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7515 &descriptorSet[0], 0, NULL);
7516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007517 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007518 m_errorMonitor->VerifyFound();
7519
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007520 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007521 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7523 }
7524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007525 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7527}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007528
Karl Schultz6addd812016-02-02 17:17:23 -07007529TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7531 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007532
Tony Barbour1fa09702017-03-16 12:09:08 -06007533 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007535 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007536 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007538 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007539}
7540
Karl Schultz6addd812016-02-02 17:17:23 -07007541TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7542 VkResult err;
7543 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007544
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007546
Tony Barbour1fa09702017-03-16 12:09:08 -06007547 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007548
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007549 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007550 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007551 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007552 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007553 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007554 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007555
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007556 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007557 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007558
7559 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007560 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007561 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7562
7563 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007564 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007565 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007566 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 -07007567 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007568
7569 // The error should be caught by validation of the BeginCommandBuffer call
7570 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7571
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007572 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007573 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007574}
7575
Chris Forbes5b3725e2017-05-18 16:01:20 -07007576TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
Chris Forbes9480ae92017-05-17 17:14:34 -07007577 ASSERT_NO_FATAL_FAILURE(Init());
7578
Chris Forbes5b3725e2017-05-18 16:01:20 -07007579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was destroyed or rerecorded");
Chris Forbes9480ae92017-05-17 17:14:34 -07007580
7581 // A pool we can reset in.
7582 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_,
7583 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
7584 VkCommandBufferObj secondary(m_device, &pool,
7585 VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7586
7587 secondary.begin();
7588 secondary.end();
7589
7590 m_commandBuffer->begin();
7591 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7592
7593 // rerecording of secondary
Chris Forbes5b3725e2017-05-18 16:01:20 -07007594 secondary.reset(); // explicit reset here.
Chris Forbes9480ae92017-05-17 17:14:34 -07007595 secondary.begin();
7596 secondary.end();
7597
7598 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Chris Forbes5b3725e2017-05-18 16:01:20 -07007599 m_errorMonitor->VerifyFound();
7600}
Chris Forbes9480ae92017-05-17 17:14:34 -07007601
Chris Forbes5b3725e2017-05-18 16:01:20 -07007602TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
7603 ASSERT_NO_FATAL_FAILURE(Init());
7604
7605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was destroyed or rerecorded");
7606
7607 // A pool we can reset in.
7608 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_,
7609 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
7610 VkCommandBufferObj secondary(m_device, &pool,
7611 VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7612
7613 secondary.begin();
7614 secondary.end();
7615
7616 m_commandBuffer->begin();
7617 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7618
7619 // rerecording of secondary
7620 secondary.begin(); // implicit reset in begin
7621 secondary.end();
7622
7623 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Chris Forbes9480ae92017-05-17 17:14:34 -07007624 m_errorMonitor->VerifyFound();
7625}
7626
Chris Forbes42bbfe22017-05-18 16:20:53 -07007627TEST_F(VkLayerTest, CascadedInvalidation) {
7628 ASSERT_NO_FATAL_FAILURE(Init());
7629
7630 VkEventCreateInfo eci = { VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0 };
7631 VkEvent event;
7632 vkCreateEvent(m_device->device(), &eci, nullptr, &event);
7633
7634 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7635 secondary.begin();
7636 vkCmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
7637 secondary.end();
7638
7639 m_commandBuffer->begin();
7640 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7641 m_commandBuffer->end();
7642
7643 // destroying the event should invalidate both primary and secondary CB
7644 vkDestroyEvent(m_device->device(), event, nullptr);
7645
7646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "invalid because bound Event");
7647 m_commandBuffer->QueueCommandBuffer(false);
7648 m_errorMonitor->VerifyFound();
7649}
7650
Karl Schultz6addd812016-02-02 17:17:23 -07007651TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007652 // Cause error due to Begin while recording CB
7653 // Then cause 2 errors for attempting to reset CB w/o having
7654 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7655 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007657
Tony Barbour1fa09702017-03-16 12:09:08 -06007658 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007659
7660 // Calls AllocateCommandBuffers
7661 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7662
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007663 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007664 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007665 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7666 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007667 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7668 cmd_buf_info.pNext = NULL;
7669 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007670 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007671
7672 // Begin CB to transition to recording state
7673 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7674 // Can't re-begin. This should trigger error
7675 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007676 m_errorMonitor->VerifyFound();
7677
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007679 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007680 // Reset attempt will trigger error due to incorrect CommandPool state
7681 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007682 m_errorMonitor->VerifyFound();
7683
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007685 // Transition CB to RECORDED state
7686 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7687 // Now attempting to Begin will implicitly reset, which triggers error
7688 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007689 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007690}
7691
Karl Schultz6addd812016-02-02 17:17:23 -07007692TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007693 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007694 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007695
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7697 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007698
Tony Barbour1fa09702017-03-16 12:09:08 -06007699 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007701
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7704 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007705
7706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7708 ds_pool_ci.pNext = NULL;
7709 ds_pool_ci.maxSets = 1;
7710 ds_pool_ci.poolSizeCount = 1;
7711 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007712
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007713 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007714 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007715 ASSERT_VK_SUCCESS(err);
7716
Tony Barboureb254902015-07-15 12:50:33 -06007717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007718 dsl_binding.binding = 0;
7719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7720 dsl_binding.descriptorCount = 1;
7721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007723
Tony Barboureb254902015-07-15 12:50:33 -06007724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7726 ds_layout_ci.pNext = NULL;
7727 ds_layout_ci.bindingCount = 1;
7728 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007729
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007730 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007732 ASSERT_VK_SUCCESS(err);
7733
7734 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007735 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007737 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007738 alloc_info.descriptorPool = ds_pool;
7739 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007741 ASSERT_VK_SUCCESS(err);
7742
Tony Barboureb254902015-07-15 12:50:33 -06007743 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007744 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7745 pipeline_layout_ci.setLayoutCount = 1;
7746 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007747
7748 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007749 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007750 ASSERT_VK_SUCCESS(err);
7751
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007752 VkViewport vp = {}; // Just need dummy vp to point to
7753 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007754
7755 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007756 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7757 vp_state_ci.scissorCount = 1;
7758 vp_state_ci.pScissors = &sc;
7759 vp_state_ci.viewportCount = 1;
7760 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007761
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007762 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7763 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7764 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7765 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7766 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7767 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007768 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007769 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007770 rs_state_ci.lineWidth = 1.0f;
7771
7772 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7773 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7774 vi_ci.pNext = nullptr;
7775 vi_ci.vertexBindingDescriptionCount = 0;
7776 vi_ci.pVertexBindingDescriptions = nullptr;
7777 vi_ci.vertexAttributeDescriptionCount = 0;
7778 vi_ci.pVertexAttributeDescriptions = nullptr;
7779
7780 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7781 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7782 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7783
7784 VkPipelineShaderStageCreateInfo shaderStages[2];
7785 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7786
7787 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7788 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007789 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007790 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007791
Tony Barboureb254902015-07-15 12:50:33 -06007792 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7794 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007795 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007796 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7797 gp_ci.layout = pipeline_layout;
7798 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007799 gp_ci.pVertexInputState = &vi_ci;
7800 gp_ci.pInputAssemblyState = &ia_ci;
7801
7802 gp_ci.stageCount = 1;
7803 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007804
7805 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007806 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7807 pc_ci.initialDataSize = 0;
7808 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007809
7810 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007811 VkPipelineCache pipelineCache;
7812
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007813 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007814 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007815 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007816 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007817
Chia-I Wuf7458c52015-10-26 21:10:41 +08007818 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7819 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7820 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7821 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007822}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007823
Tobin Ehlis912df022015-09-17 08:46:18 -06007824/*// TODO : This test should be good, but needs Tess support in compiler to run
7825TEST_F(VkLayerTest, InvalidPatchControlPoints)
7826{
7827 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007828 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007829
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007831 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7832primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007833
Tony Barbour1fa09702017-03-16 12:09:08 -06007834 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007836
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007837 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007838 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007839 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007840
7841 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7842 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7843 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007844 ds_pool_ci.poolSizeCount = 1;
7845 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007846
7847 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007848 err = vkCreateDescriptorPool(m_device->device(),
7849VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007850 ASSERT_VK_SUCCESS(err);
7851
7852 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007853 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007854 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007855 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007856 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7857 dsl_binding.pImmutableSamplers = NULL;
7858
7859 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007860 ds_layout_ci.sType =
7861VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007862 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007863 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007864 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007865
7866 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007867 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7868&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007869 ASSERT_VK_SUCCESS(err);
7870
7871 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007872 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7873VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007874 ASSERT_VK_SUCCESS(err);
7875
7876 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007877 pipeline_layout_ci.sType =
7878VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007879 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007880 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007881 pipeline_layout_ci.pSetLayouts = &ds_layout;
7882
7883 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007884 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7885&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007886 ASSERT_VK_SUCCESS(err);
7887
7888 VkPipelineShaderStageCreateInfo shaderStages[3];
7889 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7890
Karl Schultz6addd812016-02-02 17:17:23 -07007891 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7892this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007893 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007894 VkShaderObj
7895tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7896this);
7897 VkShaderObj
7898te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7899this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007900
Karl Schultz6addd812016-02-02 17:17:23 -07007901 shaderStages[0].sType =
7902VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007903 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007904 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007905 shaderStages[1].sType =
7906VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007907 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007908 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007909 shaderStages[2].sType =
7910VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007911 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007912 shaderStages[2].shader = te.handle();
7913
7914 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007915 iaCI.sType =
7916VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007917 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007918
7919 VkPipelineTessellationStateCreateInfo tsCI = {};
7920 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7921 tsCI.patchControlPoints = 0; // This will cause an error
7922
7923 VkGraphicsPipelineCreateInfo gp_ci = {};
7924 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7925 gp_ci.pNext = NULL;
7926 gp_ci.stageCount = 3;
7927 gp_ci.pStages = shaderStages;
7928 gp_ci.pVertexInputState = NULL;
7929 gp_ci.pInputAssemblyState = &iaCI;
7930 gp_ci.pTessellationState = &tsCI;
7931 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007932 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007933 gp_ci.pMultisampleState = NULL;
7934 gp_ci.pDepthStencilState = NULL;
7935 gp_ci.pColorBlendState = NULL;
7936 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7937 gp_ci.layout = pipeline_layout;
7938 gp_ci.renderPass = renderPass();
7939
7940 VkPipelineCacheCreateInfo pc_ci = {};
7941 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7942 pc_ci.pNext = NULL;
7943 pc_ci.initialSize = 0;
7944 pc_ci.initialData = 0;
7945 pc_ci.maxSize = 0;
7946
7947 VkPipeline pipeline;
7948 VkPipelineCache pipelineCache;
7949
Karl Schultz6addd812016-02-02 17:17:23 -07007950 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7951&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007952 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007953 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7954&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007955
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007956 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007957
Chia-I Wuf7458c52015-10-26 21:10:41 +08007958 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007962}
7963*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007964
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007965TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007966 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007967
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007968 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007969
Tony Barbour1fa09702017-03-16 12:09:08 -06007970 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007972
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007973 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007974 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7975 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976
7977 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007978 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7979 ds_pool_ci.maxSets = 1;
7980 ds_pool_ci.poolSizeCount = 1;
7981 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007982
7983 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007984 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007985 ASSERT_VK_SUCCESS(err);
7986
7987 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007988 dsl_binding.binding = 0;
7989 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7990 dsl_binding.descriptorCount = 1;
7991 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992
7993 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007994 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7995 ds_layout_ci.bindingCount = 1;
7996 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997
7998 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007999 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008000 ASSERT_VK_SUCCESS(err);
8001
8002 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008003 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008004 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008005 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008006 alloc_info.descriptorPool = ds_pool;
8007 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008008 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008009 ASSERT_VK_SUCCESS(err);
8010
8011 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008012 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8013 pipeline_layout_ci.setLayoutCount = 1;
8014 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008015
8016 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008018 ASSERT_VK_SUCCESS(err);
8019
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008020 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008022 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07008023 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008025 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008026
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008027 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8028 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8029 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8030 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8031 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8032 rs_state_ci.depthClampEnable = VK_FALSE;
8033 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8034 rs_state_ci.depthBiasEnable = VK_FALSE;
8035
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008036 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8037 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8038 vi_ci.pNext = nullptr;
8039 vi_ci.vertexBindingDescriptionCount = 0;
8040 vi_ci.pVertexBindingDescriptions = nullptr;
8041 vi_ci.vertexAttributeDescriptionCount = 0;
8042 vi_ci.pVertexAttributeDescriptions = nullptr;
8043
8044 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8045 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8046 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8047
8048 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8049 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8050 pipe_ms_state_ci.pNext = NULL;
8051 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8052 pipe_ms_state_ci.sampleShadingEnable = 0;
8053 pipe_ms_state_ci.minSampleShading = 1.0;
8054 pipe_ms_state_ci.pSampleMask = NULL;
8055
Cody Northropeb3a6c12015-10-05 14:44:45 -06008056 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008057 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008058
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008060 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08008061 shaderStages[0] = vs.GetStageCreateInfo();
8062 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008063
8064 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008065 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8066 gp_ci.stageCount = 2;
8067 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008068 gp_ci.pVertexInputState = &vi_ci;
8069 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008070 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008071 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008072 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008073 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8074 gp_ci.layout = pipeline_layout;
8075 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008076
8077 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008078 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008079
8080 VkPipeline pipeline;
8081 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008082 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008083 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008085 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008086 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008087
8088 // Check case where multiViewport is disabled and viewport count is not 1
8089 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8092 vp_state_ci.scissorCount = 0;
8093 vp_state_ci.viewportCount = 0;
8094 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8095 m_errorMonitor->VerifyFound();
8096 } else {
8097 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008098 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008099 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008100 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008101
8102 // Check is that viewportcount and scissorcount match
8103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8104 vp_state_ci.scissorCount = 1;
8105 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8106 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8107 m_errorMonitor->VerifyFound();
8108
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008109 // Check case where multiViewport is enabled and viewport count is greater than max
8110 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8113 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8114 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8115 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8116 m_errorMonitor->VerifyFound();
8117 }
8118 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008119
Chia-I Wuf7458c52015-10-26 21:10:41 +08008120 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8121 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8123 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008124}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008125
8126// 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
8127// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008128TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008129 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008130
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008131 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8132
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008134
Tony Barbour1fa09702017-03-16 12:09:08 -06008135 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008137
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008138 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008139 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8140 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008141
8142 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008143 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8144 ds_pool_ci.maxSets = 1;
8145 ds_pool_ci.poolSizeCount = 1;
8146 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008147
8148 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008149 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008150 ASSERT_VK_SUCCESS(err);
8151
8152 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008153 dsl_binding.binding = 0;
8154 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8155 dsl_binding.descriptorCount = 1;
8156 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
8158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8160 ds_layout_ci.bindingCount = 1;
8161 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008162
8163 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008165 ASSERT_VK_SUCCESS(err);
8166
8167 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008168 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008169 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008170 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008171 alloc_info.descriptorPool = ds_pool;
8172 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008173 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008174 ASSERT_VK_SUCCESS(err);
8175
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008176 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8177 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8178 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8179
8180 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8181 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8182 vi_ci.pNext = nullptr;
8183 vi_ci.vertexBindingDescriptionCount = 0;
8184 vi_ci.pVertexBindingDescriptions = nullptr;
8185 vi_ci.vertexAttributeDescriptionCount = 0;
8186 vi_ci.pVertexAttributeDescriptions = nullptr;
8187
8188 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8189 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8190 pipe_ms_state_ci.pNext = NULL;
8191 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8192 pipe_ms_state_ci.sampleShadingEnable = 0;
8193 pipe_ms_state_ci.minSampleShading = 1.0;
8194 pipe_ms_state_ci.pSampleMask = NULL;
8195
Tobin Ehlise68360f2015-10-01 11:15:13 -06008196 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008197 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8198 pipeline_layout_ci.setLayoutCount = 1;
8199 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008200
8201 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008202 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008203 ASSERT_VK_SUCCESS(err);
8204
8205 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8206 // Set scissor as dynamic to avoid second error
8207 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008208 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8209 dyn_state_ci.dynamicStateCount = 1;
8210 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008211
Cody Northropeb3a6c12015-10-05 14:44:45 -06008212 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008213 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008215 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008216 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8217 // 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 +08008218 shaderStages[0] = vs.GetStageCreateInfo();
8219 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008220
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008221 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8222 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8223 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8224 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8225 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8226 rs_state_ci.depthClampEnable = VK_FALSE;
8227 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8228 rs_state_ci.depthBiasEnable = VK_FALSE;
8229
Tobin Ehlise68360f2015-10-01 11:15:13 -06008230 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8232 gp_ci.stageCount = 2;
8233 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008234 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008235 // Not setting VP state w/o dynamic vp state should cause validation error
8236 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008237 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008238 gp_ci.pVertexInputState = &vi_ci;
8239 gp_ci.pInputAssemblyState = &ia_ci;
8240 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008241 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8242 gp_ci.layout = pipeline_layout;
8243 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008244
8245 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008246 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008247
8248 VkPipeline pipeline;
8249 VkPipelineCache pipelineCache;
8250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008251 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008253 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008254
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008255 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008256
Chia-I Wuf7458c52015-10-26 21:10:41 +08008257 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8258 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8259 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8260 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008261}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008262
8263// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8264// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008265TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8266 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008267
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008269
Tony Barbour1fa09702017-03-16 12:09:08 -06008270 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008271
8272 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008273 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008274 return;
8275 }
8276
Tobin Ehlise68360f2015-10-01 11:15:13 -06008277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008278
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008279 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008280 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8281 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008282
8283 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008284 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8285 ds_pool_ci.maxSets = 1;
8286 ds_pool_ci.poolSizeCount = 1;
8287 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008288
8289 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008290 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008291 ASSERT_VK_SUCCESS(err);
8292
8293 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008294 dsl_binding.binding = 0;
8295 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8296 dsl_binding.descriptorCount = 1;
8297 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008298
8299 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008300 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8301 ds_layout_ci.bindingCount = 1;
8302 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008303
8304 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008305 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008306 ASSERT_VK_SUCCESS(err);
8307
8308 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008309 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008310 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008311 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008312 alloc_info.descriptorPool = ds_pool;
8313 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008314 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315 ASSERT_VK_SUCCESS(err);
8316
8317 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008318 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8319 pipeline_layout_ci.setLayoutCount = 1;
8320 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321
8322 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008323 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008324 ASSERT_VK_SUCCESS(err);
8325
8326 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008327 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8328 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008329 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008330 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008331 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008332
8333 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8334 // Set scissor as dynamic to avoid that error
8335 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008336 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8337 dyn_state_ci.dynamicStateCount = 1;
8338 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008339
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008340 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8341 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8342 pipe_ms_state_ci.pNext = NULL;
8343 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8344 pipe_ms_state_ci.sampleShadingEnable = 0;
8345 pipe_ms_state_ci.minSampleShading = 1.0;
8346 pipe_ms_state_ci.pSampleMask = NULL;
8347
Cody Northropeb3a6c12015-10-05 14:44:45 -06008348 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008349 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008350
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008351 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008352 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8353 // 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 +08008354 shaderStages[0] = vs.GetStageCreateInfo();
8355 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008356
Cody Northropf6622dc2015-10-06 10:33:21 -06008357 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8358 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8359 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008360 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008361 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008362 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008363 vi_ci.pVertexAttributeDescriptions = nullptr;
8364
8365 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8366 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8367 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8368
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008369 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008370 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008371 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008372 rs_ci.pNext = nullptr;
8373
Mark Youngc89c6312016-03-31 16:03:20 -06008374 VkPipelineColorBlendAttachmentState att = {};
8375 att.blendEnable = VK_FALSE;
8376 att.colorWriteMask = 0xf;
8377
Cody Northropf6622dc2015-10-06 10:33:21 -06008378 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8379 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8380 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008381 cb_ci.attachmentCount = 1;
8382 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008383
Tobin Ehlise68360f2015-10-01 11:15:13 -06008384 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008385 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8386 gp_ci.stageCount = 2;
8387 gp_ci.pStages = shaderStages;
8388 gp_ci.pVertexInputState = &vi_ci;
8389 gp_ci.pInputAssemblyState = &ia_ci;
8390 gp_ci.pViewportState = &vp_state_ci;
8391 gp_ci.pRasterizationState = &rs_ci;
8392 gp_ci.pColorBlendState = &cb_ci;
8393 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008394 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008395 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8396 gp_ci.layout = pipeline_layout;
8397 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008398
8399 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008400 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008401
8402 VkPipeline pipeline;
8403 VkPipelineCache pipelineCache;
8404
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008405 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008406 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008407 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008408
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008409 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008410
Tobin Ehlisd332f282015-10-02 11:00:56 -06008411 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008412 // First need to successfully create the PSO from above by setting
8413 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008414 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 -07008415
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008416 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008417 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008418 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008419 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008420 m_commandBuffer->BeginCommandBuffer();
8421 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008422 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008423 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008424 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008425 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008426 Draw(1, 0, 0, 0);
8427
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008428 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008429
8430 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8431 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8432 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8433 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008434 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008435}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008436
8437// 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 -07008438// viewportCount
8439TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8440 VkResult err;
8441
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008443
Tony Barbour1fa09702017-03-16 12:09:08 -06008444 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008445
8446 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008447 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008448 return;
8449 }
8450
Karl Schultz6addd812016-02-02 17:17:23 -07008451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8452
8453 VkDescriptorPoolSize ds_type_count = {};
8454 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8455 ds_type_count.descriptorCount = 1;
8456
8457 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8458 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8459 ds_pool_ci.maxSets = 1;
8460 ds_pool_ci.poolSizeCount = 1;
8461 ds_pool_ci.pPoolSizes = &ds_type_count;
8462
8463 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008464 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008465 ASSERT_VK_SUCCESS(err);
8466
8467 VkDescriptorSetLayoutBinding dsl_binding = {};
8468 dsl_binding.binding = 0;
8469 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8470 dsl_binding.descriptorCount = 1;
8471 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8472
8473 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8474 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8475 ds_layout_ci.bindingCount = 1;
8476 ds_layout_ci.pBindings = &dsl_binding;
8477
8478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008480 ASSERT_VK_SUCCESS(err);
8481
8482 VkDescriptorSet descriptorSet;
8483 VkDescriptorSetAllocateInfo alloc_info = {};
8484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8485 alloc_info.descriptorSetCount = 1;
8486 alloc_info.descriptorPool = ds_pool;
8487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008489 ASSERT_VK_SUCCESS(err);
8490
8491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8493 pipeline_layout_ci.setLayoutCount = 1;
8494 pipeline_layout_ci.pSetLayouts = &ds_layout;
8495
8496 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008497 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008498 ASSERT_VK_SUCCESS(err);
8499
8500 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8501 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8502 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008503 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008505 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008506
8507 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8508 // Set scissor as dynamic to avoid that error
8509 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8510 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8511 dyn_state_ci.dynamicStateCount = 1;
8512 dyn_state_ci.pDynamicStates = &vp_state;
8513
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008514 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8515 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8516 pipe_ms_state_ci.pNext = NULL;
8517 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8518 pipe_ms_state_ci.sampleShadingEnable = 0;
8519 pipe_ms_state_ci.minSampleShading = 1.0;
8520 pipe_ms_state_ci.pSampleMask = NULL;
8521
Karl Schultz6addd812016-02-02 17:17:23 -07008522 VkPipelineShaderStageCreateInfo shaderStages[2];
8523 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8524
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008526 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8527 // 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 -07008528 shaderStages[0] = vs.GetStageCreateInfo();
8529 shaderStages[1] = fs.GetStageCreateInfo();
8530
8531 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8532 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8533 vi_ci.pNext = nullptr;
8534 vi_ci.vertexBindingDescriptionCount = 0;
8535 vi_ci.pVertexBindingDescriptions = nullptr;
8536 vi_ci.vertexAttributeDescriptionCount = 0;
8537 vi_ci.pVertexAttributeDescriptions = nullptr;
8538
8539 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8540 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8541 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8542
8543 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8544 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008545 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008546 rs_ci.pNext = nullptr;
8547
Mark Youngc89c6312016-03-31 16:03:20 -06008548 VkPipelineColorBlendAttachmentState att = {};
8549 att.blendEnable = VK_FALSE;
8550 att.colorWriteMask = 0xf;
8551
Karl Schultz6addd812016-02-02 17:17:23 -07008552 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8553 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8554 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008555 cb_ci.attachmentCount = 1;
8556 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008557
8558 VkGraphicsPipelineCreateInfo gp_ci = {};
8559 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8560 gp_ci.stageCount = 2;
8561 gp_ci.pStages = shaderStages;
8562 gp_ci.pVertexInputState = &vi_ci;
8563 gp_ci.pInputAssemblyState = &ia_ci;
8564 gp_ci.pViewportState = &vp_state_ci;
8565 gp_ci.pRasterizationState = &rs_ci;
8566 gp_ci.pColorBlendState = &cb_ci;
8567 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008568 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008569 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8570 gp_ci.layout = pipeline_layout;
8571 gp_ci.renderPass = renderPass();
8572
8573 VkPipelineCacheCreateInfo pc_ci = {};
8574 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8575
8576 VkPipeline pipeline;
8577 VkPipelineCache pipelineCache;
8578
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008579 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008580 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008581 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008582
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008583 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008584
8585 // Now hit second fail case where we set scissor w/ different count than PSO
8586 // First need to successfully create the PSO from above by setting
8587 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8589 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008590
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008591 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008592 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008593 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008594 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008595 m_commandBuffer->BeginCommandBuffer();
8596 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008597 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008598 VkViewport viewports[1] = {};
8599 viewports[0].width = 8;
8600 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008601 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008602 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008603 Draw(1, 0, 0, 0);
8604
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008605 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008606
Chia-I Wuf7458c52015-10-26 21:10:41 +08008607 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8608 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8609 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8610 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008611 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008612}
8613
Mark Young7394fdd2016-03-31 14:56:43 -06008614TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8615 VkResult err;
8616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008618
Tony Barbour1fa09702017-03-16 12:09:08 -06008619 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8621
8622 VkDescriptorPoolSize ds_type_count = {};
8623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8624 ds_type_count.descriptorCount = 1;
8625
8626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8628 ds_pool_ci.maxSets = 1;
8629 ds_pool_ci.poolSizeCount = 1;
8630 ds_pool_ci.pPoolSizes = &ds_type_count;
8631
8632 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008633 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008634 ASSERT_VK_SUCCESS(err);
8635
8636 VkDescriptorSetLayoutBinding dsl_binding = {};
8637 dsl_binding.binding = 0;
8638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8639 dsl_binding.descriptorCount = 1;
8640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8641
8642 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8643 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8644 ds_layout_ci.bindingCount = 1;
8645 ds_layout_ci.pBindings = &dsl_binding;
8646
8647 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008648 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008649 ASSERT_VK_SUCCESS(err);
8650
8651 VkDescriptorSet descriptorSet;
8652 VkDescriptorSetAllocateInfo alloc_info = {};
8653 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8654 alloc_info.descriptorSetCount = 1;
8655 alloc_info.descriptorPool = ds_pool;
8656 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008657 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008658 ASSERT_VK_SUCCESS(err);
8659
8660 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8661 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8662 pipeline_layout_ci.setLayoutCount = 1;
8663 pipeline_layout_ci.pSetLayouts = &ds_layout;
8664
8665 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008666 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008667 ASSERT_VK_SUCCESS(err);
8668
8669 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8670 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8671 vp_state_ci.scissorCount = 1;
8672 vp_state_ci.pScissors = NULL;
8673 vp_state_ci.viewportCount = 1;
8674 vp_state_ci.pViewports = NULL;
8675
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008676 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008677 // Set scissor as dynamic to avoid that error
8678 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8679 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8680 dyn_state_ci.dynamicStateCount = 2;
8681 dyn_state_ci.pDynamicStates = dynamic_states;
8682
8683 VkPipelineShaderStageCreateInfo shaderStages[2];
8684 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8685
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8687 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008688 this); // TODO - We shouldn't need a fragment shader
8689 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008690 shaderStages[0] = vs.GetStageCreateInfo();
8691 shaderStages[1] = fs.GetStageCreateInfo();
8692
8693 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8694 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8695 vi_ci.pNext = nullptr;
8696 vi_ci.vertexBindingDescriptionCount = 0;
8697 vi_ci.pVertexBindingDescriptions = nullptr;
8698 vi_ci.vertexAttributeDescriptionCount = 0;
8699 vi_ci.pVertexAttributeDescriptions = nullptr;
8700
8701 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8702 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8703 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8704
8705 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8706 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8707 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008708 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008709
Mark Young47107952016-05-02 15:59:55 -06008710 // Check too low (line width of -1.0f).
8711 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008712
8713 VkPipelineColorBlendAttachmentState att = {};
8714 att.blendEnable = VK_FALSE;
8715 att.colorWriteMask = 0xf;
8716
8717 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8718 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8719 cb_ci.pNext = nullptr;
8720 cb_ci.attachmentCount = 1;
8721 cb_ci.pAttachments = &att;
8722
8723 VkGraphicsPipelineCreateInfo gp_ci = {};
8724 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8725 gp_ci.stageCount = 2;
8726 gp_ci.pStages = shaderStages;
8727 gp_ci.pVertexInputState = &vi_ci;
8728 gp_ci.pInputAssemblyState = &ia_ci;
8729 gp_ci.pViewportState = &vp_state_ci;
8730 gp_ci.pRasterizationState = &rs_ci;
8731 gp_ci.pColorBlendState = &cb_ci;
8732 gp_ci.pDynamicState = &dyn_state_ci;
8733 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8734 gp_ci.layout = pipeline_layout;
8735 gp_ci.renderPass = renderPass();
8736
8737 VkPipelineCacheCreateInfo pc_ci = {};
8738 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8739
8740 VkPipeline pipeline;
8741 VkPipelineCache pipelineCache;
8742
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008744 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008746
8747 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008748 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008751
8752 // Check too high (line width of 65536.0f).
8753 rs_ci.lineWidth = 65536.0f;
8754
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008755 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008756 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008757 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008758
8759 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008760 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008761
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008763
8764 dyn_state_ci.dynamicStateCount = 3;
8765
8766 rs_ci.lineWidth = 1.0f;
8767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008768 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008769 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008770 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008771 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008772 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008773
8774 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008775 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008776 m_errorMonitor->VerifyFound();
8777
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008779
8780 // Check too high with dynamic setting.
8781 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8782 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008783 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008784
8785 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8786 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008789 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008790}
8791
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008792TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8793 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8794
8795 ASSERT_NO_FATAL_FAILURE(Init());
8796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8797
8798 VkPipelineCache pipeline_cache;
8799 {
8800 VkPipelineCacheCreateInfo create_info{};
8801 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8802
8803 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8804 ASSERT_VK_SUCCESS(err);
8805 }
8806
8807 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8808 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8809
8810 VkPipelineShaderStageCreateInfo stages[2]{{}};
8811 stages[0] = vs.GetStageCreateInfo();
8812 stages[1] = fs.GetStageCreateInfo();
8813
8814 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8815 VkVertexInputBindingDescription vertex_input_binding_description{};
8816 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8817
8818 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8819 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8820 vertex_input_state.pNext = nullptr;
8821 vertex_input_state.vertexBindingDescriptionCount = 1;
8822 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8823 vertex_input_state.vertexAttributeDescriptionCount = 0;
8824 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8825
8826 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8827 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8828 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8829
8830 VkViewport viewport{};
8831 VkPipelineViewportStateCreateInfo viewport_state{};
8832 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8833 viewport_state.scissorCount = 1;
8834 viewport_state.viewportCount = 1;
8835 viewport_state.pViewports = &viewport;
8836
8837 VkPipelineMultisampleStateCreateInfo multisample_state{};
8838 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8839 multisample_state.pNext = nullptr;
8840 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8841 multisample_state.sampleShadingEnable = 0;
8842 multisample_state.minSampleShading = 1.0;
8843 multisample_state.pSampleMask = nullptr;
8844
8845 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8846 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8847 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8848 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8849 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8850 rasterization_state.depthClampEnable = VK_FALSE;
8851 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8852 rasterization_state.depthBiasEnable = VK_FALSE;
8853
8854 VkPipelineLayout pipeline_layout;
8855 {
8856 VkPipelineLayoutCreateInfo create_info{};
8857 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8858 create_info.setLayoutCount = 0;
8859 create_info.pSetLayouts = nullptr;
8860
8861 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8862 ASSERT_VK_SUCCESS(err);
8863 }
8864
8865 {
8866 VkGraphicsPipelineCreateInfo create_info{};
8867 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8868 create_info.stageCount = 2;
8869 create_info.pStages = stages;
8870 create_info.pVertexInputState = &vertex_input_state;
8871 create_info.pInputAssemblyState = &input_assembly_state;
8872 create_info.pViewportState = &viewport_state;
8873 create_info.pMultisampleState = &multisample_state;
8874 create_info.pRasterizationState = &rasterization_state;
8875 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8876 create_info.layout = pipeline_layout;
8877 create_info.renderPass = renderPass();
8878
8879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8880 VkPipeline pipeline;
8881 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8882 m_errorMonitor->VerifyFound();
8883 }
8884
8885 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8887}
8888
8889TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8890 TEST_DESCRIPTION(
8891 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8892
8893 ASSERT_NO_FATAL_FAILURE(Init());
8894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8895
8896 VkPipelineCache pipeline_cache;
8897 {
8898 VkPipelineCacheCreateInfo create_info{};
8899 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8900
8901 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8902 ASSERT_VK_SUCCESS(err);
8903 }
8904
8905 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8906 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8907
8908 VkPipelineShaderStageCreateInfo stages[2]{{}};
8909 stages[0] = vs.GetStageCreateInfo();
8910 stages[1] = fs.GetStageCreateInfo();
8911
8912 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8913 VkVertexInputBindingDescription vertex_input_binding_description{};
8914 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8915
8916 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8917 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8918 vertex_input_state.pNext = nullptr;
8919 vertex_input_state.vertexBindingDescriptionCount = 1;
8920 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8921 vertex_input_state.vertexAttributeDescriptionCount = 0;
8922 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8923
8924 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8925 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8926 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8927
8928 VkViewport viewport{};
8929 VkPipelineViewportStateCreateInfo viewport_state{};
8930 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8931 viewport_state.scissorCount = 1;
8932 viewport_state.viewportCount = 1;
8933 viewport_state.pViewports = &viewport;
8934
8935 VkPipelineMultisampleStateCreateInfo multisample_state{};
8936 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8937 multisample_state.pNext = nullptr;
8938 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8939 multisample_state.sampleShadingEnable = 0;
8940 multisample_state.minSampleShading = 1.0;
8941 multisample_state.pSampleMask = nullptr;
8942
8943 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8944 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8945 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8946 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8947 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8948 rasterization_state.depthClampEnable = VK_FALSE;
8949 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8950 rasterization_state.depthBiasEnable = VK_FALSE;
8951
8952 VkPipelineLayout pipeline_layout;
8953 {
8954 VkPipelineLayoutCreateInfo create_info{};
8955 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8956 create_info.setLayoutCount = 0;
8957 create_info.pSetLayouts = nullptr;
8958
8959 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8960 ASSERT_VK_SUCCESS(err);
8961 }
8962
8963 {
8964 VkGraphicsPipelineCreateInfo create_info{};
8965 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8966 create_info.stageCount = 2;
8967 create_info.pStages = stages;
8968 create_info.pVertexInputState = &vertex_input_state;
8969 create_info.pInputAssemblyState = &input_assembly_state;
8970 create_info.pViewportState = &viewport_state;
8971 create_info.pMultisampleState = &multisample_state;
8972 create_info.pRasterizationState = &rasterization_state;
8973 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8974 create_info.layout = pipeline_layout;
8975 create_info.renderPass = renderPass();
8976
8977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8978 VkPipeline pipeline;
8979 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8980 m_errorMonitor->VerifyFound();
8981 }
8982
8983 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8984 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8985}
8986
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008987TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8988 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8989
8990 ASSERT_NO_FATAL_FAILURE(Init());
8991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8992
8993 VkPipelineCache pipeline_cache;
8994 {
8995 VkPipelineCacheCreateInfo create_info{};
8996 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8997
8998 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8999 ASSERT_VK_SUCCESS(err);
9000 }
9001
9002 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9003 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9004
9005 VkPipelineShaderStageCreateInfo stages[2]{{}};
9006 stages[0] = vs.GetStageCreateInfo();
9007 stages[1] = fs.GetStageCreateInfo();
9008
9009 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
9010 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9011 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
9012
9013 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9014 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9015 vertex_input_state.pNext = nullptr;
9016 vertex_input_state.vertexBindingDescriptionCount = 0;
9017 vertex_input_state.pVertexBindingDescriptions = nullptr;
9018 vertex_input_state.vertexAttributeDescriptionCount = 1;
9019 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9020
9021 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9022 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9023 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9024
9025 VkViewport viewport{};
9026 VkPipelineViewportStateCreateInfo viewport_state{};
9027 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9028 viewport_state.scissorCount = 1;
9029 viewport_state.viewportCount = 1;
9030 viewport_state.pViewports = &viewport;
9031
9032 VkPipelineMultisampleStateCreateInfo multisample_state{};
9033 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9034 multisample_state.pNext = nullptr;
9035 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9036 multisample_state.sampleShadingEnable = 0;
9037 multisample_state.minSampleShading = 1.0;
9038 multisample_state.pSampleMask = nullptr;
9039
9040 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9041 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9042 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9043 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9044 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9045 rasterization_state.depthClampEnable = VK_FALSE;
9046 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9047 rasterization_state.depthBiasEnable = VK_FALSE;
9048
9049 VkPipelineLayout pipeline_layout;
9050 {
9051 VkPipelineLayoutCreateInfo create_info{};
9052 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9053 create_info.setLayoutCount = 0;
9054 create_info.pSetLayouts = nullptr;
9055
9056 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9057 ASSERT_VK_SUCCESS(err);
9058 }
9059
9060 {
9061 VkGraphicsPipelineCreateInfo create_info{};
9062 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9063 create_info.stageCount = 2;
9064 create_info.pStages = stages;
9065 create_info.pVertexInputState = &vertex_input_state;
9066 create_info.pInputAssemblyState = &input_assembly_state;
9067 create_info.pViewportState = &viewport_state;
9068 create_info.pMultisampleState = &multisample_state;
9069 create_info.pRasterizationState = &rasterization_state;
9070 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9071 create_info.layout = pipeline_layout;
9072 create_info.renderPass = renderPass();
9073
9074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
9075 VkPipeline pipeline;
9076 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9077 m_errorMonitor->VerifyFound();
9078 }
9079
9080 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9082}
9083
9084TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
9085 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
9086
9087 ASSERT_NO_FATAL_FAILURE(Init());
9088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9089
9090 VkPipelineCache pipeline_cache;
9091 {
9092 VkPipelineCacheCreateInfo create_info{};
9093 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9094
9095 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9096 ASSERT_VK_SUCCESS(err);
9097 }
9098
9099 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9100 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9101
9102 VkPipelineShaderStageCreateInfo stages[2]{{}};
9103 stages[0] = vs.GetStageCreateInfo();
9104 stages[1] = fs.GetStageCreateInfo();
9105
9106 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9107 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9108 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9109
9110 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9111 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9112 vertex_input_state.pNext = nullptr;
9113 vertex_input_state.vertexBindingDescriptionCount = 0;
9114 vertex_input_state.pVertexBindingDescriptions = nullptr;
9115 vertex_input_state.vertexAttributeDescriptionCount = 1;
9116 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9117
9118 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9119 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9120 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9121
9122 VkViewport viewport{};
9123 VkPipelineViewportStateCreateInfo viewport_state{};
9124 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9125 viewport_state.scissorCount = 1;
9126 viewport_state.viewportCount = 1;
9127 viewport_state.pViewports = &viewport;
9128
9129 VkPipelineMultisampleStateCreateInfo multisample_state{};
9130 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9131 multisample_state.pNext = nullptr;
9132 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9133 multisample_state.sampleShadingEnable = 0;
9134 multisample_state.minSampleShading = 1.0;
9135 multisample_state.pSampleMask = nullptr;
9136
9137 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9138 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9139 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9140 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9141 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9142 rasterization_state.depthClampEnable = VK_FALSE;
9143 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9144 rasterization_state.depthBiasEnable = VK_FALSE;
9145
9146 VkPipelineLayout pipeline_layout;
9147 {
9148 VkPipelineLayoutCreateInfo create_info{};
9149 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9150 create_info.setLayoutCount = 0;
9151 create_info.pSetLayouts = nullptr;
9152
9153 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9154 ASSERT_VK_SUCCESS(err);
9155 }
9156
9157 {
9158 VkGraphicsPipelineCreateInfo create_info{};
9159 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9160 create_info.stageCount = 2;
9161 create_info.pStages = stages;
9162 create_info.pVertexInputState = &vertex_input_state;
9163 create_info.pInputAssemblyState = &input_assembly_state;
9164 create_info.pViewportState = &viewport_state;
9165 create_info.pMultisampleState = &multisample_state;
9166 create_info.pRasterizationState = &rasterization_state;
9167 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9168 create_info.layout = pipeline_layout;
9169 create_info.renderPass = renderPass();
9170
9171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9172 VkPipeline pipeline;
9173 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9174 m_errorMonitor->VerifyFound();
9175 }
9176
9177 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9178 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9179}
9180
9181TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9182 TEST_DESCRIPTION(
9183 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9184
9185 ASSERT_NO_FATAL_FAILURE(Init());
9186 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9187
9188 VkPipelineCache pipeline_cache;
9189 {
9190 VkPipelineCacheCreateInfo create_info{};
9191 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9192
9193 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9194 ASSERT_VK_SUCCESS(err);
9195 }
9196
9197 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9198 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9199
9200 VkPipelineShaderStageCreateInfo stages[2]{{}};
9201 stages[0] = vs.GetStageCreateInfo();
9202 stages[1] = fs.GetStageCreateInfo();
9203
9204 // Test when offset is greater than maximum.
9205 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9206 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9207
9208 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9209 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9210 vertex_input_state.pNext = nullptr;
9211 vertex_input_state.vertexBindingDescriptionCount = 0;
9212 vertex_input_state.pVertexBindingDescriptions = nullptr;
9213 vertex_input_state.vertexAttributeDescriptionCount = 1;
9214 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9215
9216 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9217 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9218 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9219
9220 VkViewport viewport{};
9221 VkPipelineViewportStateCreateInfo viewport_state{};
9222 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9223 viewport_state.scissorCount = 1;
9224 viewport_state.viewportCount = 1;
9225 viewport_state.pViewports = &viewport;
9226
9227 VkPipelineMultisampleStateCreateInfo multisample_state{};
9228 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9229 multisample_state.pNext = nullptr;
9230 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9231 multisample_state.sampleShadingEnable = 0;
9232 multisample_state.minSampleShading = 1.0;
9233 multisample_state.pSampleMask = nullptr;
9234
9235 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9236 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9237 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9238 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9239 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9240 rasterization_state.depthClampEnable = VK_FALSE;
9241 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9242 rasterization_state.depthBiasEnable = VK_FALSE;
9243
9244 VkPipelineLayout pipeline_layout;
9245 {
9246 VkPipelineLayoutCreateInfo create_info{};
9247 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9248 create_info.setLayoutCount = 0;
9249 create_info.pSetLayouts = nullptr;
9250
9251 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9252 ASSERT_VK_SUCCESS(err);
9253 }
9254
9255 {
9256 VkGraphicsPipelineCreateInfo create_info{};
9257 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9258 create_info.stageCount = 2;
9259 create_info.pStages = stages;
9260 create_info.pVertexInputState = &vertex_input_state;
9261 create_info.pInputAssemblyState = &input_assembly_state;
9262 create_info.pViewportState = &viewport_state;
9263 create_info.pMultisampleState = &multisample_state;
9264 create_info.pRasterizationState = &rasterization_state;
9265 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9266 create_info.layout = pipeline_layout;
9267 create_info.renderPass = renderPass();
9268
9269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9270 VkPipeline pipeline;
9271 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9272 m_errorMonitor->VerifyFound();
9273 }
9274
9275 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9276 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9277}
9278
Karl Schultz6addd812016-02-02 17:17:23 -07009279TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009280 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009282 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009283
Tony Barbour1fa09702017-03-16 12:09:08 -06009284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009286
Tony Barbour552f6c02016-12-21 14:34:07 -07009287 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009288 // Don't care about RenderPass handle b/c error should be flagged before
9289 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009290 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009291
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009292 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009293}
9294
Karl Schultz6addd812016-02-02 17:17:23 -07009295TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009296 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9298 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009299
Tony Barbour1fa09702017-03-16 12:09:08 -06009300 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009302
Tony Barbour552f6c02016-12-21 14:34:07 -07009303 m_commandBuffer->BeginCommandBuffer();
9304 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009305 // Just create a dummy Renderpass that's non-NULL so we can get to the
9306 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009307 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009308
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009309 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009310}
9311
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009312TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009313 TEST_DESCRIPTION(
9314 "Begin a renderPass where clearValueCount is less than"
9315 "the number of renderPass attachments that use loadOp"
9316 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009317
Tony Barbour1fa09702017-03-16 12:09:08 -06009318 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9320
9321 // Create a renderPass with a single attachment that uses loadOp CLEAR
9322 VkAttachmentReference attach = {};
9323 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9324 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009325 subpass.colorAttachmentCount = 1;
9326 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009327 VkRenderPassCreateInfo rpci = {};
9328 rpci.subpassCount = 1;
9329 rpci.pSubpasses = &subpass;
9330 rpci.attachmentCount = 1;
9331 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009332 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009333 // Set loadOp to CLEAR
9334 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9335 rpci.pAttachments = &attach_desc;
9336 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9337 VkRenderPass rp;
9338 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9339
9340 VkCommandBufferInheritanceInfo hinfo = {};
9341 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9342 hinfo.renderPass = VK_NULL_HANDLE;
9343 hinfo.subpass = 0;
9344 hinfo.framebuffer = VK_NULL_HANDLE;
9345 hinfo.occlusionQueryEnable = VK_FALSE;
9346 hinfo.queryFlags = 0;
9347 hinfo.pipelineStatistics = 0;
9348 VkCommandBufferBeginInfo info = {};
9349 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9350 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9351 info.pInheritanceInfo = &hinfo;
9352
9353 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9354 VkRenderPassBeginInfo rp_begin = {};
9355 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9356 rp_begin.pNext = NULL;
9357 rp_begin.renderPass = renderPass();
9358 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009359 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009360
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009362
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009363 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009364
9365 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009366
9367 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009368}
9369
Cody Northrop3bb4d962016-05-09 16:15:57 -06009370TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009371 TEST_DESCRIPTION("End a command buffer with an active render pass");
9372
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9374 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009375
Tony Barbour1fa09702017-03-16 12:09:08 -06009376 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9378
Tony Barbour552f6c02016-12-21 14:34:07 -07009379 m_commandBuffer->BeginCommandBuffer();
9380 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9381 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009382
9383 m_errorMonitor->VerifyFound();
9384
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009385 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9386 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009387}
9388
Karl Schultz6addd812016-02-02 17:17:23 -07009389TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009390 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9392 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009393
Tony Barbour1fa09702017-03-16 12:09:08 -06009394 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009396
Tony Barbour552f6c02016-12-21 14:34:07 -07009397 m_commandBuffer->BeginCommandBuffer();
9398 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009399
9400 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009401 vk_testing::Buffer dstBuffer;
9402 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009403
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009404 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009406 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009407}
9408
Karl Schultz6addd812016-02-02 17:17:23 -07009409TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009410 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9412 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413
Tony Barbour1fa09702017-03-16 12:09:08 -06009414 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009416
Tony Barbour552f6c02016-12-21 14:34:07 -07009417 m_commandBuffer->BeginCommandBuffer();
9418 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009419
9420 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009421 vk_testing::Buffer dstBuffer;
9422 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009423
Karl Schultz6addd812016-02-02 17:17:23 -07009424 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009425 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9426 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9427 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009429 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009430}
9431
Petr Kraus4d718682017-05-18 03:38:41 +02009432TEST_F(VkLayerTest, ClearColorImageWithBadRange) {
9433 TEST_DESCRIPTION("Record clear color with an invalid VkImageSubresourceRange");
9434
9435 ASSERT_NO_FATAL_FAILURE(Init());
9436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9437
9438 VkImageObj image(m_device);
9439 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9440 ASSERT_TRUE(image.create_info().arrayLayers == 1);
9441 ASSERT_TRUE(image.initialized());
9442 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
9443
9444 const VkClearColorValue clear_color = {{0.0f, 0.0f, 0.0f, 1.0f}};
9445
9446 m_commandBuffer->BeginCommandBuffer();
9447 const auto cb_handle = m_commandBuffer->GetBufferHandle();
9448
9449 // Try levelCount = 0
9450 {
9451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9452 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 0, 1};
9453 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9454 m_errorMonitor->VerifyFound();
9455 }
9456
9457 // Try baseLevel + levelCount > image.mipLevels
9458 {
9459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9460 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 0, 1};
9461 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9462 m_errorMonitor->VerifyFound();
9463 }
9464
9465 // Try baseLevel >= image.mipLevels with VK_REMAINING_MIP_LEVELS
9466 {
9467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9468 "vkCmdClearColorImage: pRanges[0].baseMipLevel (= 1) is greater or equal to the mip "
9469 "level count of the image (i.e. greater or equal to 1).");
9470 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 1, VK_REMAINING_MIP_LEVELS, 0, 1};
9471 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9472 m_errorMonitor->VerifyFound();
9473 }
9474
9475 // Try layerCount = 0
9476 {
9477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
9478 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 0};
9479 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9480 m_errorMonitor->VerifyFound();
9481 }
9482
9483 // Try baseLayer + layerCount > image.arrayLayers
9484 {
9485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
9486 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1, 1};
9487 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9488 m_errorMonitor->VerifyFound();
9489 }
9490
9491 // Try baseLevel >= image.mipLevels with VK_REMAINING_ARRAY_LAYERS
9492 {
9493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9494 "vkCmdClearColorImage: pRanges[0].baseArrayLayer (= 1) is greater or equal to the "
9495 "arrayLayers of the image when it was created (i.e. greater or equal to 1).");
9496 const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1, VK_REMAINING_ARRAY_LAYERS};
9497 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
9498 m_errorMonitor->VerifyFound();
9499 }
9500}
9501
9502TEST_F(VkLayerTest, ClearDepthStencilWithBadRange) {
9503 TEST_DESCRIPTION("Record clear depth with an invalid VkImageSubresourceRange");
9504
9505 ASSERT_NO_FATAL_FAILURE(Init());
9506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9507
9508 const auto depth_format = FindSupportedDepthStencilFormat(gpu());
9509 if (!depth_format) {
9510 printf(" No Depth + Stencil format found. Skipped.\n");
9511 return;
9512 }
9513
9514 VkImageObj image(m_device);
9515 image.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9516 ASSERT_TRUE(image.create_info().arrayLayers == 1);
9517 ASSERT_TRUE(image.initialized());
9518 const VkImageAspectFlags ds_aspect = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
9519 image.SetLayout(ds_aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
9520
9521 const VkClearDepthStencilValue clear_value = {};
9522
9523 m_commandBuffer->BeginCommandBuffer();
9524 const auto cb_handle = m_commandBuffer->GetBufferHandle();
9525
9526 // Try levelCount = 0
9527 {
9528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9529 const VkImageSubresourceRange range = {ds_aspect, 0, 0, 0, 1};
9530 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9531 m_errorMonitor->VerifyFound();
9532 }
9533
9534 // Try baseLevel + levelCount > image.mipLevels
9535 {
9536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9537 const VkImageSubresourceRange range = {ds_aspect, 1, 1, 0, 1};
9538 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9539 m_errorMonitor->VerifyFound();
9540 }
9541
9542 // Try baseLevel >= image.mipLevels with VK_REMAINING_MIP_LEVELS
9543 {
9544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9545 "vkCmdClearDepthStencilImage: pRanges[0].baseMipLevel (= 1) is greater or equal to "
9546 "the mip level count of the image (i.e. greater or equal to 1).");
9547 const VkImageSubresourceRange range = {ds_aspect, 1, VK_REMAINING_MIP_LEVELS, 0, 1};
9548 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9549 m_errorMonitor->VerifyFound();
9550 }
9551
9552 // Try layerCount = 0
9553 {
9554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
9555 const VkImageSubresourceRange range = {ds_aspect, 0, 1, 0, 0};
9556 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9557 m_errorMonitor->VerifyFound();
9558 }
9559
9560 // Try baseLayer + layerCount > image.arrayLayers
9561 {
9562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
9563 const VkImageSubresourceRange range = {ds_aspect, 0, 1, 1, 1};
9564 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9565 m_errorMonitor->VerifyFound();
9566 }
9567
9568 // Try baseLevel >= image.mipLevels with VK_REMAINING_ARRAY_LAYERS
9569 {
9570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9571 "vkCmdClearDepthStencilImage: pRanges[0].baseArrayLayer (= 1) is greater or equal to "
9572 "the arrayLayers of the image when it was created (i.e. greater or equal to 1).");
9573 const VkImageSubresourceRange range = {ds_aspect, 0, 1, 1, VK_REMAINING_ARRAY_LAYERS};
9574 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
9575 m_errorMonitor->VerifyFound();
9576 }
9577}
9578
Karl Schultz6addd812016-02-02 17:17:23 -07009579TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009580 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9582 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009583
Tony Barbour1fa09702017-03-16 12:09:08 -06009584 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009586
Tony Barbour552f6c02016-12-21 14:34:07 -07009587 m_commandBuffer->BeginCommandBuffer();
9588 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009589
Michael Lentine0a369f62016-02-03 16:51:46 -06009590 VkClearColorValue clear_color;
9591 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009592 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9593 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9594 const int32_t tex_width = 32;
9595 const int32_t tex_height = 32;
9596 VkImageCreateInfo image_create_info = {};
9597 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9598 image_create_info.pNext = NULL;
9599 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9600 image_create_info.format = tex_format;
9601 image_create_info.extent.width = tex_width;
9602 image_create_info.extent.height = tex_height;
9603 image_create_info.extent.depth = 1;
9604 image_create_info.mipLevels = 1;
9605 image_create_info.arrayLayers = 1;
9606 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9607 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009608 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009609
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009610 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009611 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009612
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009613 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009614
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009615 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009616
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009617 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009618}
9619
Karl Schultz6addd812016-02-02 17:17:23 -07009620TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009621 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9623 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009624
Tony Barbour1fa09702017-03-16 12:09:08 -06009625 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009627
Dave Houlton1d2022c2017-03-29 11:43:58 -06009628 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009629 if (!depth_format) {
9630 printf(" No Depth + Stencil format found. Skipped.\n");
9631 return;
9632 }
9633
Tony Barbour552f6c02016-12-21 14:34:07 -07009634 m_commandBuffer->BeginCommandBuffer();
9635 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009636
9637 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009638 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009639 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9640 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009641 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009642 image_create_info.extent.width = 64;
9643 image_create_info.extent.height = 64;
9644 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9645 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009646
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009647 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009648 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009650 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009651
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009652 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9653 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009654
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009655 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009656}
9657
Karl Schultz6addd812016-02-02 17:17:23 -07009658TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009659 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009660 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009661
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9663 "vkCmdClearAttachments(): This call "
9664 "must be issued inside an active "
9665 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009666
Tony Barbour1fa09702017-03-16 12:09:08 -06009667 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009669
9670 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009671 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009672 ASSERT_VK_SUCCESS(err);
9673
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009674 VkClearAttachment color_attachment;
9675 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9676 color_attachment.clearValue.color.float32[0] = 0;
9677 color_attachment.clearValue.color.float32[1] = 0;
9678 color_attachment.clearValue.color.float32[2] = 0;
9679 color_attachment.clearValue.color.float32[3] = 0;
9680 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009681 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009682 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009684 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009685}
9686
Chris Forbes3b97e932016-09-07 11:29:24 +12009687TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009688 TEST_DESCRIPTION(
9689 "Test that an error is produced when CmdNextSubpass is "
9690 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009691
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9693 "vkCmdNextSubpass(): Attempted to advance "
9694 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009695
Tony Barbour1fa09702017-03-16 12:09:08 -06009696 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9698
Tony Barbour552f6c02016-12-21 14:34:07 -07009699 m_commandBuffer->BeginCommandBuffer();
9700 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009701
9702 // error here.
9703 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9704 m_errorMonitor->VerifyFound();
9705
Tony Barbour552f6c02016-12-21 14:34:07 -07009706 m_commandBuffer->EndRenderPass();
9707 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009708}
9709
Chris Forbes6d624702016-09-07 13:57:05 +12009710TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009711 TEST_DESCRIPTION(
9712 "Test that an error is produced when CmdEndRenderPass is "
9713 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009714
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9716 "vkCmdEndRenderPass(): Called before reaching "
9717 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009718
Tony Barbour1fa09702017-03-16 12:09:08 -06009719 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009720 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9721 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009722
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009724
9725 VkRenderPass rp;
9726 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9727 ASSERT_VK_SUCCESS(err);
9728
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009729 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009730
9731 VkFramebuffer fb;
9732 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9733 ASSERT_VK_SUCCESS(err);
9734
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009735 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009736
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009737 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 +12009738
9739 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9740
9741 // Error here.
9742 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9743 m_errorMonitor->VerifyFound();
9744
9745 // Clean up.
9746 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9747 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9748}
9749
Karl Schultz9e66a292016-04-21 15:57:51 -06009750TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9751 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9753 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009754
Tony Barbour1fa09702017-03-16 12:09:08 -06009755 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009756 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009757
9758 VkBufferMemoryBarrier buf_barrier = {};
9759 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9760 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9761 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9762 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9763 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9764 buf_barrier.buffer = VK_NULL_HANDLE;
9765 buf_barrier.offset = 0;
9766 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009767 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9768 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009769
9770 m_errorMonitor->VerifyFound();
9771}
9772
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009773TEST_F(VkLayerTest, InvalidBarriers) {
9774 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009777
Tony Barbour1fa09702017-03-16 12:09:08 -06009778 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009779 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009780 if (!depth_format) {
9781 printf(" No Depth + Stencil format found. Skipped.\n");
9782 return;
9783 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9785
9786 VkMemoryBarrier mem_barrier = {};
9787 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9788 mem_barrier.pNext = NULL;
9789 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9790 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009791 m_commandBuffer->BeginCommandBuffer();
9792 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009793 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009794 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009795 &mem_barrier, 0, nullptr, 0, nullptr);
9796 m_errorMonitor->VerifyFound();
9797
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009799 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009800 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 -06009801 ASSERT_TRUE(image.initialized());
9802 VkImageMemoryBarrier img_barrier = {};
9803 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9804 img_barrier.pNext = NULL;
9805 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9806 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009807 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009808 // New layout can't be UNDEFINED
9809 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9810 img_barrier.image = image.handle();
9811 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9812 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9813 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9814 img_barrier.subresourceRange.baseArrayLayer = 0;
9815 img_barrier.subresourceRange.baseMipLevel = 0;
9816 img_barrier.subresourceRange.layerCount = 1;
9817 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009818 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9819 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009820 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009821
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009822 // Transition image to color attachment optimal
9823 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9824 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9825 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9826 nullptr, 0, nullptr, 1, &img_barrier);
9827 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009828
Mark Lobodzinski45daf6e2017-05-10 13:19:02 -06009829 // Try to change layout in a renderpass
9830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02080);
9831 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9832 nullptr, 0, nullptr, 1, &img_barrier);
9833 m_errorMonitor->VerifyFound();
9834
9835 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Petr Kraus4d718682017-05-18 03:38:41 +02009836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009837 // baseArrayLayer + layerCount must be <= image's arrayLayers
9838 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009839 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9840 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009841 m_errorMonitor->VerifyFound();
9842 img_barrier.subresourceRange.baseArrayLayer = 0;
9843
Petr Kraus4d718682017-05-18 03:38:41 +02009844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009845 // baseMipLevel + levelCount must be <= image's mipLevels
9846 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009847 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9848 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009849 m_errorMonitor->VerifyFound();
9850 img_barrier.subresourceRange.baseMipLevel = 0;
9851
Mike Weiblen7053aa32017-01-25 15:21:10 -07009852 // levelCount must be non-zero.
9853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9854 img_barrier.subresourceRange.levelCount = 0;
9855 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9856 nullptr, 0, nullptr, 1, &img_barrier);
9857 m_errorMonitor->VerifyFound();
9858 img_barrier.subresourceRange.levelCount = 1;
9859
9860 // layerCount must be non-zero.
Petr Kraus4d718682017-05-18 03:38:41 +02009861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
Mike Weiblen7053aa32017-01-25 15:21:10 -07009862 img_barrier.subresourceRange.layerCount = 0;
9863 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9864 nullptr, 0, nullptr, 1, &img_barrier);
9865 m_errorMonitor->VerifyFound();
9866 img_barrier.subresourceRange.layerCount = 1;
9867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009868 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 -06009869 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009870 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9871 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009872 VkBufferMemoryBarrier buf_barrier = {};
9873 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9874 buf_barrier.pNext = NULL;
9875 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9876 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9877 buf_barrier.buffer = buffer.handle();
9878 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9879 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9880 buf_barrier.offset = 0;
9881 buf_barrier.size = VK_WHOLE_SIZE;
9882 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009883 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9884 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009885 m_errorMonitor->VerifyFound();
9886 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9887
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009889 buf_barrier.offset = 257;
9890 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009891 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9892 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009893 m_errorMonitor->VerifyFound();
9894 buf_barrier.offset = 0;
9895
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009897 buf_barrier.size = 257;
9898 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009899 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9900 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009901 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009902
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009903 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009906 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009907 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009908 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009909 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9910 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009911 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009912
9913 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009914 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009915 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9916 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009917 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009918
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009919 // Having only one of depth or stencil set for DS image is an error
9920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9921 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9922 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9923 nullptr, 0, nullptr, 1, &img_barrier);
9924 m_errorMonitor->VerifyFound();
9925
9926 // Having anything other than DEPTH and STENCIL is an error
9927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009928 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9929 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9930 nullptr, 0, nullptr, 1, &img_barrier);
9931 m_errorMonitor->VerifyFound();
9932
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009933 // Now test depth-only
9934 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009935 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9936 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009937 VkDepthStencilObj d_image(m_device);
9938 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9939 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009940 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009941 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009942 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009943
9944 // DEPTH bit must be set
9945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9946 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009947 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009948 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9949 0, nullptr, 0, nullptr, 1, &img_barrier);
9950 m_errorMonitor->VerifyFound();
9951
9952 // No bits other than DEPTH may be set
9953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9954 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9955 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009956 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9957 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009958 m_errorMonitor->VerifyFound();
9959 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009960
9961 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009962 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9963 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009964 VkDepthStencilObj s_image(m_device);
9965 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9966 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009967 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009968 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009969 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009970 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9972 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009973 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009974 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9975 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009976 m_errorMonitor->VerifyFound();
9977 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009978
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009979 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009980 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009981 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 -06009982 ASSERT_TRUE(c_image.initialized());
9983 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9984 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9985 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009986
9987 // COLOR bit must be set
9988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9989 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009990 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009991 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9992 nullptr, 0, nullptr, 1, &img_barrier);
9993 m_errorMonitor->VerifyFound();
9994
9995 // No bits other than COLOR may be set
9996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9997 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9998 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009999 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10000 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010001 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010002
Mike Weiblene6e01172017-03-07 22:18:40 -070010003 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
10004 {
10005 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010006 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 -070010007 ASSERT_TRUE(img_color.initialized());
10008
10009 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010010 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 -070010011 ASSERT_TRUE(img_ds.initialized());
10012
10013 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010014 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 -070010015 ASSERT_TRUE(img_xfer_src.initialized());
10016
10017 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010018 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 -070010019 ASSERT_TRUE(img_xfer_dst.initialized());
10020
10021 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010022 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 -070010023 ASSERT_TRUE(img_sampled.initialized());
10024
10025 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010026 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 -070010027 ASSERT_TRUE(img_input.initialized());
10028
10029 const struct {
10030 VkImageObj &image_obj;
10031 VkImageLayout bad_layout;
10032 UNIQUE_VALIDATION_ERROR_CODE msg_code;
10033 } bad_buffer_layouts[] = {
10034 // clang-format off
10035 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
10036 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
10037 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
10038 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
10039 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
10040 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
10041 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
10042 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
10043 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
10044 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
10045 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
10046 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
10047 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
10048 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
10049 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
10050 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
10051 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
10052 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
10053 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
10054 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
10055 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
10056 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
10057 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
10058 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
10059 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
10060 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
10061 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
10062 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
10063 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
10064 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
10065 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
10066 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
10067 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
10068 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
10069 // clang-format on
10070 };
10071 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
10072
10073 for (uint32_t i = 0; i < layout_count; ++i) {
10074 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
10075 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
10076 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
10077 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
10078 : VK_IMAGE_ASPECT_COLOR_BIT;
10079
10080 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
10081 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
10083 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
10084 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
10085 m_errorMonitor->VerifyFound();
10086
10087 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
10088 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
10089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
10090 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
10091 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
10092 m_errorMonitor->VerifyFound();
10093 }
10094
10095 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
10096 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10097 }
10098
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010099 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
10100
10101 // Create command pool with incompatible queueflags
10102 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -070010103 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010104 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010105 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -070010106 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010107 }
10108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
10109
10110 VkCommandPool command_pool;
10111 VkCommandPoolCreateInfo pool_create_info{};
10112 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
10113 pool_create_info.queueFamilyIndex = queue_family_index;
10114 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
10115 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
10116
10117 // Allocate a command buffer
10118 VkCommandBuffer bad_command_buffer;
10119 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
10120 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
10121 command_buffer_allocate_info.commandPool = command_pool;
10122 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
10123 command_buffer_allocate_info.commandBufferCount = 1;
10124 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
10125
10126 VkCommandBufferBeginInfo cbbi = {};
10127 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10128 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
10129 buf_barrier.offset = 0;
10130 buf_barrier.size = VK_WHOLE_SIZE;
10131 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10132 &buf_barrier, 0, nullptr);
10133 m_errorMonitor->VerifyFound();
10134
10135 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
10136 vkEndCommandBuffer(bad_command_buffer);
10137 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010138 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -070010139 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010140 }
10141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
10142 VkEvent event;
10143 VkEventCreateInfo event_create_info{};
10144 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10145 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10146 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
10147 nullptr, 0, nullptr);
10148 m_errorMonitor->VerifyFound();
10149
10150 vkEndCommandBuffer(bad_command_buffer);
10151 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010152}
10153
Chris Forbes50223732017-05-01 09:43:35 -070010154TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
10155 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
10156 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -060010157
Chris Forbes50223732017-05-01 09:43:35 -070010158 // The required behavior here was a bit unclear in earlier versions of the
10159 // spec, but there is no memory dependency required here, so this should
10160 // work without warnings.
10161
10162 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060010163 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -060010164 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010165 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 -070010166 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -060010167 ASSERT_TRUE(image.initialized());
10168
10169 VkImageMemoryBarrier barrier = {};
10170 VkImageSubresourceRange range;
10171 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010172 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -070010173 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010174 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10175 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10176 barrier.image = image.handle();
10177 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10178 range.baseMipLevel = 0;
10179 range.levelCount = 1;
10180 range.baseArrayLayer = 0;
10181 range.layerCount = 1;
10182 barrier.subresourceRange = range;
10183 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
10184 cmdbuf.BeginCommandBuffer();
10185 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10186 &barrier);
10187 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10188 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10189 barrier.srcAccessMask = 0;
10190 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10191 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10192 &barrier);
10193
Chris Forbes50223732017-05-01 09:43:35 -070010194 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -060010195}
10196
Karl Schultz6addd812016-02-02 17:17:23 -070010197TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010198 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -060010199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010201
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010202 uint32_t const indices[] = {0};
10203 VkBufferCreateInfo buf_info = {};
10204 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10205 buf_info.size = 1024;
10206 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10207 buf_info.queueFamilyIndexCount = 1;
10208 buf_info.pQueueFamilyIndices = indices;
10209
10210 VkBuffer buffer;
10211 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10212 ASSERT_VK_SUCCESS(err);
10213
10214 VkMemoryRequirements requirements;
10215 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10216
10217 VkMemoryAllocateInfo alloc_info{};
10218 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10219 alloc_info.pNext = NULL;
10220 alloc_info.memoryTypeIndex = 0;
10221 alloc_info.allocationSize = requirements.size;
10222 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10223 ASSERT_TRUE(pass);
10224
10225 VkDeviceMemory memory;
10226 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10227 ASSERT_VK_SUCCESS(err);
10228
10229 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010230 ASSERT_VK_SUCCESS(err);
10231
Tony Barbour552f6c02016-12-21 14:34:07 -070010232 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010233 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010234
Karl Schultz6addd812016-02-02 17:17:23 -070010235 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10236 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010237 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10239 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010240 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010241
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010242 vkFreeMemory(m_device->device(), memory, NULL);
10243 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010244}
10245
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010246TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10247 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010248 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10250 VkBufferCreateInfo buffCI = {};
10251 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10252 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010253 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010254 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010255 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010256 uint32_t qfi[2];
10257 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010258 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010259
10260 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010261 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010262
10263 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Petr Kraus97291752017-05-11 01:05:16 +020010265 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (= 777) is not one of the queue "
10266 "families given via VkDeviceQueueCreateInfo structures when the device was created.");
Mark Lobodzinski1f9ebb72017-05-11 15:25:51 -060010267 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010268 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010269
10270 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010271 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10273
10274 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10275 buffCI.queueFamilyIndexCount = 2;
10276 qfi[0] = 1;
10277 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010278 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010279 VkDeviceMemory mem;
10280 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010281 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010282
10283 VkMemoryAllocateInfo alloc_info = {};
10284 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10285 alloc_info.allocationSize = 1024;
10286 bool pass = false;
10287 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10288 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010289 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010290 return;
10291 }
10292 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010293 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010294
10295 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010296 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010297 m_commandBuffer->end();
10298 QueueCommandBuffer(false);
10299 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010300 vkDestroyBuffer(m_device->device(), ib2, NULL);
10301 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010302 }
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010303}
10304
Karl Schultz6addd812016-02-02 17:17:23 -070010305TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010306 TEST_DESCRIPTION(
10307 "Attempt vkCmdExecuteCommands with a primary command buffer"
10308 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010309
Tony Barbour1fa09702017-03-16 12:09:08 -060010310 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010312
Chris Forbesf29a84f2016-10-06 18:39:28 +130010313 // An empty primary command buffer
10314 VkCommandBufferObj cb(m_device, m_commandPool);
10315 cb.BeginCommandBuffer();
10316 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010317
Chris Forbesf29a84f2016-10-06 18:39:28 +130010318 m_commandBuffer->BeginCommandBuffer();
10319 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10320 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010321
Chris Forbesf29a84f2016-10-06 18:39:28 +130010322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10323 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010324 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010325
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010326 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010327}
10328
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010329TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010330 TEST_DESCRIPTION(
10331 "Attempt to update descriptor sets for images and buffers "
10332 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010333 VkResult err;
10334
Tony Barbour1fa09702017-03-16 12:09:08 -060010335 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010336 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10337 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10338 ds_type_count[i].type = VkDescriptorType(i);
10339 ds_type_count[i].descriptorCount = 1;
10340 }
10341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10343 ds_pool_ci.pNext = NULL;
10344 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10345 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10346 ds_pool_ci.pPoolSizes = ds_type_count;
10347
10348 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010349 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010350 ASSERT_VK_SUCCESS(err);
10351
10352 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010354 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10355 dsl_binding[i].binding = 0;
10356 dsl_binding[i].descriptorType = VkDescriptorType(i);
10357 dsl_binding[i].descriptorCount = 1;
10358 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10359 dsl_binding[i].pImmutableSamplers = NULL;
10360 }
10361
10362 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10363 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10364 ds_layout_ci.pNext = NULL;
10365 ds_layout_ci.bindingCount = 1;
10366 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10367 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10368 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010369 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010370 ASSERT_VK_SUCCESS(err);
10371 }
10372 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10373 VkDescriptorSetAllocateInfo alloc_info = {};
10374 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10375 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10376 alloc_info.descriptorPool = ds_pool;
10377 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010378 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010379 ASSERT_VK_SUCCESS(err);
10380
10381 // Create a buffer & bufferView to be used for invalid updates
10382 VkBufferCreateInfo buff_ci = {};
10383 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010384 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010385 buff_ci.size = 256;
10386 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010387 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010388 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10389 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010390
10391 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10392 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10393 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10394 ASSERT_VK_SUCCESS(err);
10395
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010396 VkMemoryRequirements mem_reqs;
10397 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10398 VkMemoryAllocateInfo mem_alloc_info = {};
10399 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10400 mem_alloc_info.pNext = NULL;
10401 mem_alloc_info.memoryTypeIndex = 0;
10402 mem_alloc_info.allocationSize = mem_reqs.size;
10403 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10404 if (!pass) {
10405 vkDestroyBuffer(m_device->device(), buffer, NULL);
10406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10407 return;
10408 }
10409 VkDeviceMemory mem;
10410 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10411 ASSERT_VK_SUCCESS(err);
10412 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10413 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010414
10415 VkBufferViewCreateInfo buff_view_ci = {};
10416 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10417 buff_view_ci.buffer = buffer;
10418 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10419 buff_view_ci.range = VK_WHOLE_SIZE;
10420 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010421 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010422 ASSERT_VK_SUCCESS(err);
10423
Tony Barbour415497c2017-01-24 10:06:09 -070010424 // Now get resources / view for storage_texel_buffer
10425 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10426 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10427 if (!pass) {
10428 vkDestroyBuffer(m_device->device(), buffer, NULL);
10429 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10430 vkFreeMemory(m_device->device(), mem, NULL);
10431 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10433 return;
10434 }
10435 VkDeviceMemory storage_texel_buffer_mem;
10436 VkBufferView storage_texel_buffer_view;
10437 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10438 ASSERT_VK_SUCCESS(err);
10439 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10440 ASSERT_VK_SUCCESS(err);
10441 buff_view_ci.buffer = storage_texel_buffer;
10442 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10443 ASSERT_VK_SUCCESS(err);
10444
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010445 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010446 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010447 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010448 image_ci.format = VK_FORMAT_UNDEFINED;
10449 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10450 VkFormat format = static_cast<VkFormat>(f);
10451 VkFormatProperties fProps = m_device->format_properties(format);
10452 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10453 image_ci.format = format;
10454 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10455 break;
10456 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10457 image_ci.format = format;
10458 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10459 break;
10460 }
10461 }
10462 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10463 return;
10464 }
10465
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010466 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10467 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010468 image_ci.extent.width = 64;
10469 image_ci.extent.height = 64;
10470 image_ci.extent.depth = 1;
10471 image_ci.mipLevels = 1;
10472 image_ci.arrayLayers = 1;
10473 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010474 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010475 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010476 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10477 VkImage image;
10478 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10479 ASSERT_VK_SUCCESS(err);
10480 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010481 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010482
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010483 VkMemoryAllocateInfo mem_alloc = {};
10484 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10485 mem_alloc.pNext = NULL;
10486 mem_alloc.allocationSize = 0;
10487 mem_alloc.memoryTypeIndex = 0;
10488 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10489 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010490 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010491 ASSERT_TRUE(pass);
10492 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10493 ASSERT_VK_SUCCESS(err);
10494 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10495 ASSERT_VK_SUCCESS(err);
10496 // Now create view for image
10497 VkImageViewCreateInfo image_view_ci = {};
10498 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10499 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010500 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010501 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10502 image_view_ci.subresourceRange.layerCount = 1;
10503 image_view_ci.subresourceRange.baseArrayLayer = 0;
10504 image_view_ci.subresourceRange.levelCount = 1;
10505 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10506 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010507 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010508 ASSERT_VK_SUCCESS(err);
10509
10510 VkDescriptorBufferInfo buff_info = {};
10511 buff_info.buffer = buffer;
10512 VkDescriptorImageInfo img_info = {};
10513 img_info.imageView = image_view;
10514 VkWriteDescriptorSet descriptor_write = {};
10515 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10516 descriptor_write.dstBinding = 0;
10517 descriptor_write.descriptorCount = 1;
10518 descriptor_write.pTexelBufferView = &buff_view;
10519 descriptor_write.pBufferInfo = &buff_info;
10520 descriptor_write.pImageInfo = &img_info;
10521
10522 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010523 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010524 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10525 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10526 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10527 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10528 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10529 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10530 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10531 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10532 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10533 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10534 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010535 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010536 // Start loop at 1 as SAMPLER desc type has no usage bit error
10537 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010538 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10539 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10540 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10541 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010542 descriptor_write.descriptorType = VkDescriptorType(i);
10543 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010545
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010546 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010547
10548 m_errorMonitor->VerifyFound();
10549 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010550 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10551 descriptor_write.pTexelBufferView = &buff_view;
10552 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010553 }
Tony Barbour415497c2017-01-24 10:06:09 -070010554
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010555 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10556 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010557 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010558 vkDestroyImageView(m_device->device(), image_view, NULL);
10559 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010560 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010561 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010562 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010563 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010564 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010565 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10566}
10567
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010568TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010569 TEST_DESCRIPTION(
10570 "Attempt to update buffer descriptor set that has incorrect "
10571 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010572 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010573 "2. range value of 0\n"
10574 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010575 VkResult err;
10576
Tony Barbour1fa09702017-03-16 12:09:08 -060010577 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010578 VkDescriptorPoolSize ds_type_count = {};
10579 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10580 ds_type_count.descriptorCount = 1;
10581
10582 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10583 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10584 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010585 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010586 ds_pool_ci.maxSets = 1;
10587 ds_pool_ci.poolSizeCount = 1;
10588 ds_pool_ci.pPoolSizes = &ds_type_count;
10589
10590 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010591 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010592 ASSERT_VK_SUCCESS(err);
10593
10594 // Create layout with single uniform buffer descriptor
10595 VkDescriptorSetLayoutBinding dsl_binding = {};
10596 dsl_binding.binding = 0;
10597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10598 dsl_binding.descriptorCount = 1;
10599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10600 dsl_binding.pImmutableSamplers = NULL;
10601
10602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10604 ds_layout_ci.pNext = NULL;
10605 ds_layout_ci.bindingCount = 1;
10606 ds_layout_ci.pBindings = &dsl_binding;
10607 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010608 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010609 ASSERT_VK_SUCCESS(err);
10610
10611 VkDescriptorSet descriptor_set = {};
10612 VkDescriptorSetAllocateInfo alloc_info = {};
10613 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10614 alloc_info.descriptorSetCount = 1;
10615 alloc_info.descriptorPool = ds_pool;
10616 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010618 ASSERT_VK_SUCCESS(err);
10619
10620 // Create a buffer to be used for invalid updates
10621 VkBufferCreateInfo buff_ci = {};
10622 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10623 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010624 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010625 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10626 VkBuffer buffer;
10627 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10628 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010629
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010630 // Have to bind memory to buffer before descriptor update
10631 VkMemoryAllocateInfo mem_alloc = {};
10632 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10633 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010634 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010635 mem_alloc.memoryTypeIndex = 0;
10636
10637 VkMemoryRequirements mem_reqs;
10638 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010639 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010640 if (!pass) {
10641 vkDestroyBuffer(m_device->device(), buffer, NULL);
10642 return;
10643 }
10644
10645 VkDeviceMemory mem;
10646 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10647 ASSERT_VK_SUCCESS(err);
10648 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10649 ASSERT_VK_SUCCESS(err);
10650
10651 VkDescriptorBufferInfo buff_info = {};
10652 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010653 // Cause error due to offset out of range
10654 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010655 buff_info.range = VK_WHOLE_SIZE;
10656 VkWriteDescriptorSet descriptor_write = {};
10657 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10658 descriptor_write.dstBinding = 0;
10659 descriptor_write.descriptorCount = 1;
10660 descriptor_write.pTexelBufferView = nullptr;
10661 descriptor_write.pBufferInfo = &buff_info;
10662 descriptor_write.pImageInfo = nullptr;
10663
10664 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10665 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010667
10668 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10669
10670 m_errorMonitor->VerifyFound();
10671 // Now cause error due to range of 0
10672 buff_info.offset = 0;
10673 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010675
10676 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10677
10678 m_errorMonitor->VerifyFound();
10679 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010680 buff_info.offset = 0;
10681 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010683
10684 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10685
10686 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010687 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010688 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10689 vkDestroyBuffer(m_device->device(), buffer, NULL);
10690 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10691 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10692}
10693
Tobin Ehlis845887e2017-02-02 19:01:44 -070010694TEST_F(VkLayerTest, DSBufferLimitErrors) {
10695 TEST_DESCRIPTION(
10696 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10697 "Test cases include:\n"
10698 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10699 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10700 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10701 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10702 VkResult err;
10703
Tony Barbour1fa09702017-03-16 12:09:08 -060010704 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010705 VkDescriptorPoolSize ds_type_count[2] = {};
10706 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10707 ds_type_count[0].descriptorCount = 1;
10708 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10709 ds_type_count[1].descriptorCount = 1;
10710
10711 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10712 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10713 ds_pool_ci.pNext = NULL;
10714 ds_pool_ci.maxSets = 1;
10715 ds_pool_ci.poolSizeCount = 2;
10716 ds_pool_ci.pPoolSizes = ds_type_count;
10717
10718 VkDescriptorPool ds_pool;
10719 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10720 ASSERT_VK_SUCCESS(err);
10721
10722 // Create layout with single uniform buffer & single storage buffer descriptor
10723 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10724 dsl_binding[0].binding = 0;
10725 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10726 dsl_binding[0].descriptorCount = 1;
10727 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10728 dsl_binding[0].pImmutableSamplers = NULL;
10729 dsl_binding[1].binding = 1;
10730 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10731 dsl_binding[1].descriptorCount = 1;
10732 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10733 dsl_binding[1].pImmutableSamplers = NULL;
10734
10735 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10736 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10737 ds_layout_ci.pNext = NULL;
10738 ds_layout_ci.bindingCount = 2;
10739 ds_layout_ci.pBindings = dsl_binding;
10740 VkDescriptorSetLayout ds_layout;
10741 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10742 ASSERT_VK_SUCCESS(err);
10743
10744 VkDescriptorSet descriptor_set = {};
10745 VkDescriptorSetAllocateInfo alloc_info = {};
10746 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10747 alloc_info.descriptorSetCount = 1;
10748 alloc_info.descriptorPool = ds_pool;
10749 alloc_info.pSetLayouts = &ds_layout;
10750 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10751 ASSERT_VK_SUCCESS(err);
10752
10753 // Create a buffer to be used for invalid updates
10754 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10755 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10756 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10757 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10758 VkBufferCreateInfo ub_ci = {};
10759 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10760 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10761 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10762 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10763 VkBuffer uniform_buffer;
10764 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10765 ASSERT_VK_SUCCESS(err);
10766 VkBufferCreateInfo sb_ci = {};
10767 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10768 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10769 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10770 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10771 VkBuffer storage_buffer;
10772 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10773 ASSERT_VK_SUCCESS(err);
10774 // Have to bind memory to buffer before descriptor update
10775 VkMemoryAllocateInfo mem_alloc = {};
10776 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10777 mem_alloc.pNext = NULL;
10778 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10779 mem_alloc.memoryTypeIndex = 0;
10780
Cort Stratton77a0d592017-02-17 13:14:13 -080010781 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10782 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10783 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10784 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10785 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010786 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010788 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010789 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10790 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010791 return;
10792 }
10793
10794 VkDeviceMemory mem;
10795 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010796 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010797 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010798 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10799 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10800 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10801 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10802 return;
10803 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010804 ASSERT_VK_SUCCESS(err);
10805 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10806 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010807 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010808 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10809 ASSERT_VK_SUCCESS(err);
10810
10811 VkDescriptorBufferInfo buff_info = {};
10812 buff_info.buffer = uniform_buffer;
10813 buff_info.range = ub_ci.size; // This will exceed limit
10814 VkWriteDescriptorSet descriptor_write = {};
10815 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10816 descriptor_write.dstBinding = 0;
10817 descriptor_write.descriptorCount = 1;
10818 descriptor_write.pTexelBufferView = nullptr;
10819 descriptor_write.pBufferInfo = &buff_info;
10820 descriptor_write.pImageInfo = nullptr;
10821
10822 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10823 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010824 if (max_ub_range != UINT32_MAX) {
10825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10826 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10827 m_errorMonitor->VerifyFound();
10828 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010829 // Reduce size of range to acceptable limit & cause offset error
10830 buff_info.range = max_ub_range;
10831 buff_info.offset = min_ub_align - 1;
10832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10833 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10834 m_errorMonitor->VerifyFound();
10835
10836 // Now break storage updates
10837 buff_info.buffer = storage_buffer;
10838 buff_info.range = sb_ci.size; // This will exceed limit
10839 buff_info.offset = 0; // Reset offset for this update
10840
10841 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10842 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010843 if (max_ub_range != UINT32_MAX) {
10844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10845 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10846 m_errorMonitor->VerifyFound();
10847 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010848
10849 // Reduce size of range to acceptable limit & cause offset error
10850 buff_info.range = max_sb_range;
10851 buff_info.offset = min_sb_align - 1;
10852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10853 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10854 m_errorMonitor->VerifyFound();
10855
10856 vkFreeMemory(m_device->device(), mem, NULL);
10857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10858 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10859 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10860 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10861}
10862
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010863TEST_F(VkLayerTest, DSAspectBitsErrors) {
10864 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10865 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010866 TEST_DESCRIPTION(
10867 "Attempt to update descriptor sets for images "
10868 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010869 VkResult err;
10870
Tony Barbour1fa09702017-03-16 12:09:08 -060010871 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010872 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010873 if (!depth_format) {
10874 printf(" No Depth + Stencil format found. Skipped.\n");
10875 return;
10876 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010877 VkDescriptorPoolSize ds_type_count = {};
10878 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10879 ds_type_count.descriptorCount = 1;
10880
10881 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10882 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10883 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010884 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010885 ds_pool_ci.maxSets = 5;
10886 ds_pool_ci.poolSizeCount = 1;
10887 ds_pool_ci.pPoolSizes = &ds_type_count;
10888
10889 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010890 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010891 ASSERT_VK_SUCCESS(err);
10892
10893 VkDescriptorSetLayoutBinding dsl_binding = {};
10894 dsl_binding.binding = 0;
10895 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10896 dsl_binding.descriptorCount = 1;
10897 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10898 dsl_binding.pImmutableSamplers = NULL;
10899
10900 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10901 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10902 ds_layout_ci.pNext = NULL;
10903 ds_layout_ci.bindingCount = 1;
10904 ds_layout_ci.pBindings = &dsl_binding;
10905 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010906 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010907 ASSERT_VK_SUCCESS(err);
10908
10909 VkDescriptorSet descriptor_set = {};
10910 VkDescriptorSetAllocateInfo alloc_info = {};
10911 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10912 alloc_info.descriptorSetCount = 1;
10913 alloc_info.descriptorPool = ds_pool;
10914 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010915 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010916 ASSERT_VK_SUCCESS(err);
10917
10918 // Create an image to be used for invalid updates
10919 VkImageCreateInfo image_ci = {};
10920 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10921 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010922 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010923 image_ci.extent.width = 64;
10924 image_ci.extent.height = 64;
10925 image_ci.extent.depth = 1;
10926 image_ci.mipLevels = 1;
10927 image_ci.arrayLayers = 1;
10928 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010929 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010930 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10931 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10932 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10933 VkImage image;
10934 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10935 ASSERT_VK_SUCCESS(err);
10936 // Bind memory to image
10937 VkMemoryRequirements mem_reqs;
10938 VkDeviceMemory image_mem;
10939 bool pass;
10940 VkMemoryAllocateInfo mem_alloc = {};
10941 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10942 mem_alloc.pNext = NULL;
10943 mem_alloc.allocationSize = 0;
10944 mem_alloc.memoryTypeIndex = 0;
10945 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10946 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010947 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010948 ASSERT_TRUE(pass);
10949 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10950 ASSERT_VK_SUCCESS(err);
10951 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10952 ASSERT_VK_SUCCESS(err);
10953 // Now create view for image
10954 VkImageViewCreateInfo image_view_ci = {};
10955 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10956 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010957 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010958 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10959 image_view_ci.subresourceRange.layerCount = 1;
10960 image_view_ci.subresourceRange.baseArrayLayer = 0;
10961 image_view_ci.subresourceRange.levelCount = 1;
10962 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010963 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010964
10965 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010966 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010967 ASSERT_VK_SUCCESS(err);
10968
10969 VkDescriptorImageInfo img_info = {};
10970 img_info.imageView = image_view;
10971 VkWriteDescriptorSet descriptor_write = {};
10972 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10973 descriptor_write.dstBinding = 0;
10974 descriptor_write.descriptorCount = 1;
10975 descriptor_write.pTexelBufferView = NULL;
10976 descriptor_write.pBufferInfo = NULL;
10977 descriptor_write.pImageInfo = &img_info;
10978 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10979 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010980 const char *error_msg =
10981 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10982 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010984
10985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10986
10987 m_errorMonitor->VerifyFound();
10988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10989 vkDestroyImage(m_device->device(), image, NULL);
10990 vkFreeMemory(m_device->device(), image_mem, NULL);
10991 vkDestroyImageView(m_device->device(), image_view, NULL);
10992 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10993 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10994}
10995
Karl Schultz6addd812016-02-02 17:17:23 -070010996TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010997 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010998 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010999
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11001 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
11002 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011003
Tony Barbour1fa09702017-03-16 12:09:08 -060011004 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011005 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011006 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011007 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11008 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011009
11010 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011011 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11012 ds_pool_ci.pNext = NULL;
11013 ds_pool_ci.maxSets = 1;
11014 ds_pool_ci.poolSizeCount = 1;
11015 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011016
Tobin Ehlis3b780662015-05-28 12:11:26 -060011017 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011018 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011019 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011020 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011021 dsl_binding.binding = 0;
11022 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11023 dsl_binding.descriptorCount = 1;
11024 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11025 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011026
Tony Barboureb254902015-07-15 12:50:33 -060011027 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011028 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11029 ds_layout_ci.pNext = NULL;
11030 ds_layout_ci.bindingCount = 1;
11031 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011032
Tobin Ehlis3b780662015-05-28 12:11:26 -060011033 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011034 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011035 ASSERT_VK_SUCCESS(err);
11036
11037 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011038 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011039 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011040 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011041 alloc_info.descriptorPool = ds_pool;
11042 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011043 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011044 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011045
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011046 VkSamplerCreateInfo sampler_ci = {};
11047 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11048 sampler_ci.pNext = NULL;
11049 sampler_ci.magFilter = VK_FILTER_NEAREST;
11050 sampler_ci.minFilter = VK_FILTER_NEAREST;
11051 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11052 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11053 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11054 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11055 sampler_ci.mipLodBias = 1.0;
11056 sampler_ci.anisotropyEnable = VK_FALSE;
11057 sampler_ci.maxAnisotropy = 1;
11058 sampler_ci.compareEnable = VK_FALSE;
11059 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11060 sampler_ci.minLod = 1.0;
11061 sampler_ci.maxLod = 1.0;
11062 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11063 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11064 VkSampler sampler;
11065 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11066 ASSERT_VK_SUCCESS(err);
11067
11068 VkDescriptorImageInfo info = {};
11069 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011070
11071 VkWriteDescriptorSet descriptor_write;
11072 memset(&descriptor_write, 0, sizeof(descriptor_write));
11073 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011074 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011075 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011076 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011077 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011078 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011079
11080 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11081
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011082 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011083
Chia-I Wuf7458c52015-10-26 21:10:41 +080011084 vkDestroySampler(m_device->device(), sampler, NULL);
11085 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11086 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011087}
11088
Karl Schultz6addd812016-02-02 17:17:23 -070011089TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011090 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011091 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011092
Tobin Ehlisf922ef82016-11-30 10:19:14 -070011093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011094
Tony Barbour1fa09702017-03-16 12:09:08 -060011095 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011096 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011097 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011098 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11099 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011100
11101 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011102 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11103 ds_pool_ci.pNext = NULL;
11104 ds_pool_ci.maxSets = 1;
11105 ds_pool_ci.poolSizeCount = 1;
11106 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011107
Tobin Ehlis3b780662015-05-28 12:11:26 -060011108 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011109 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011110 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011111
Tony Barboureb254902015-07-15 12:50:33 -060011112 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011113 dsl_binding.binding = 0;
11114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11115 dsl_binding.descriptorCount = 1;
11116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11117 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011118
11119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11121 ds_layout_ci.pNext = NULL;
11122 ds_layout_ci.bindingCount = 1;
11123 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011124
Tobin Ehlis3b780662015-05-28 12:11:26 -060011125 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011127 ASSERT_VK_SUCCESS(err);
11128
11129 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011130 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011131 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011132 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011133 alloc_info.descriptorPool = ds_pool;
11134 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011137
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070011138 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11139
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011140 // Correctly update descriptor to avoid "NOT_UPDATED" error
11141 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070011142 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011143 buff_info.offset = 0;
11144 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011145
11146 VkWriteDescriptorSet descriptor_write;
11147 memset(&descriptor_write, 0, sizeof(descriptor_write));
11148 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011149 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011150 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011151 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011152 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11153 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011154
11155 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011157 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011158
Chia-I Wuf7458c52015-10-26 21:10:41 +080011159 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11160 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011161}
11162
Karl Schultz6addd812016-02-02 17:17:23 -070011163TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070011164 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070011165 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011166
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070011167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011168
Tony Barbour1fa09702017-03-16 12:09:08 -060011169 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011170 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011171 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011172 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11173 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011174
11175 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011176 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11177 ds_pool_ci.pNext = NULL;
11178 ds_pool_ci.maxSets = 1;
11179 ds_pool_ci.poolSizeCount = 1;
11180 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011181
Tobin Ehlis3b780662015-05-28 12:11:26 -060011182 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011183 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011184 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011185
Tony Barboureb254902015-07-15 12:50:33 -060011186 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011187 dsl_binding.binding = 0;
11188 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11189 dsl_binding.descriptorCount = 1;
11190 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11191 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011192
11193 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011194 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11195 ds_layout_ci.pNext = NULL;
11196 ds_layout_ci.bindingCount = 1;
11197 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011198 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011199 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011200 ASSERT_VK_SUCCESS(err);
11201
11202 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011203 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011204 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011205 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011206 alloc_info.descriptorPool = ds_pool;
11207 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011208 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011209 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011210
Tony Barboureb254902015-07-15 12:50:33 -060011211 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011212 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11213 sampler_ci.pNext = NULL;
11214 sampler_ci.magFilter = VK_FILTER_NEAREST;
11215 sampler_ci.minFilter = VK_FILTER_NEAREST;
11216 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11217 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11218 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11219 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11220 sampler_ci.mipLodBias = 1.0;
11221 sampler_ci.anisotropyEnable = VK_FALSE;
11222 sampler_ci.maxAnisotropy = 1;
11223 sampler_ci.compareEnable = VK_FALSE;
11224 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11225 sampler_ci.minLod = 1.0;
11226 sampler_ci.maxLod = 1.0;
11227 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11228 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011229
Tobin Ehlis3b780662015-05-28 12:11:26 -060011230 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011231 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011232 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011233
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011234 VkDescriptorImageInfo info = {};
11235 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011236
11237 VkWriteDescriptorSet descriptor_write;
11238 memset(&descriptor_write, 0, sizeof(descriptor_write));
11239 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011240 descriptor_write.dstSet = descriptorSet;
11241 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011242 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011243 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011244 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011245 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011246
11247 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11248
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011249 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011250
Chia-I Wuf7458c52015-10-26 21:10:41 +080011251 vkDestroySampler(m_device->device(), sampler, NULL);
11252 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11253 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011254}
11255
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011256TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11257 // Create layout w/ empty binding and attempt to update it
11258 VkResult err;
11259
Tony Barbour1fa09702017-03-16 12:09:08 -060011260 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011261
11262 VkDescriptorPoolSize ds_type_count = {};
11263 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11264 ds_type_count.descriptorCount = 1;
11265
11266 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11267 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11268 ds_pool_ci.pNext = NULL;
11269 ds_pool_ci.maxSets = 1;
11270 ds_pool_ci.poolSizeCount = 1;
11271 ds_pool_ci.pPoolSizes = &ds_type_count;
11272
11273 VkDescriptorPool ds_pool;
11274 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11275 ASSERT_VK_SUCCESS(err);
11276
11277 VkDescriptorSetLayoutBinding dsl_binding = {};
11278 dsl_binding.binding = 0;
11279 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11280 dsl_binding.descriptorCount = 0;
11281 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11282 dsl_binding.pImmutableSamplers = NULL;
11283
11284 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11285 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11286 ds_layout_ci.pNext = NULL;
11287 ds_layout_ci.bindingCount = 1;
11288 ds_layout_ci.pBindings = &dsl_binding;
11289 VkDescriptorSetLayout ds_layout;
11290 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11291 ASSERT_VK_SUCCESS(err);
11292
11293 VkDescriptorSet descriptor_set;
11294 VkDescriptorSetAllocateInfo alloc_info = {};
11295 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11296 alloc_info.descriptorSetCount = 1;
11297 alloc_info.descriptorPool = ds_pool;
11298 alloc_info.pSetLayouts = &ds_layout;
11299 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11300 ASSERT_VK_SUCCESS(err);
11301
11302 VkSamplerCreateInfo sampler_ci = {};
11303 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11304 sampler_ci.magFilter = VK_FILTER_NEAREST;
11305 sampler_ci.minFilter = VK_FILTER_NEAREST;
11306 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11307 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11308 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11309 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11310 sampler_ci.mipLodBias = 1.0;
11311 sampler_ci.maxAnisotropy = 1;
11312 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11313 sampler_ci.minLod = 1.0;
11314 sampler_ci.maxLod = 1.0;
11315 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11316
11317 VkSampler sampler;
11318 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11319 ASSERT_VK_SUCCESS(err);
11320
11321 VkDescriptorImageInfo info = {};
11322 info.sampler = sampler;
11323
11324 VkWriteDescriptorSet descriptor_write;
11325 memset(&descriptor_write, 0, sizeof(descriptor_write));
11326 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11327 descriptor_write.dstSet = descriptor_set;
11328 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011329 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011330 // This is the wrong type, but empty binding error will be flagged first
11331 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11332 descriptor_write.pImageInfo = &info;
11333
11334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11335 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11336 m_errorMonitor->VerifyFound();
11337
11338 vkDestroySampler(m_device->device(), sampler, NULL);
11339 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11340 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11341}
11342
Karl Schultz6addd812016-02-02 17:17:23 -070011343TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11344 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11345 // types
11346 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 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 -060011349
Tony Barbour1fa09702017-03-16 12:09:08 -060011350 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011351
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011352 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011353 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11354 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011355
11356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11358 ds_pool_ci.pNext = NULL;
11359 ds_pool_ci.maxSets = 1;
11360 ds_pool_ci.poolSizeCount = 1;
11361 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011362
Tobin Ehlis3b780662015-05-28 12:11:26 -060011363 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011364 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011365 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011366 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011367 dsl_binding.binding = 0;
11368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11369 dsl_binding.descriptorCount = 1;
11370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11371 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011372
Tony Barboureb254902015-07-15 12:50:33 -060011373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11375 ds_layout_ci.pNext = NULL;
11376 ds_layout_ci.bindingCount = 1;
11377 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011378
Tobin Ehlis3b780662015-05-28 12:11:26 -060011379 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011381 ASSERT_VK_SUCCESS(err);
11382
11383 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011384 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011386 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011387 alloc_info.descriptorPool = ds_pool;
11388 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011390 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011391
Tony Barboureb254902015-07-15 12:50:33 -060011392 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011393 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11394 sampler_ci.pNext = NULL;
11395 sampler_ci.magFilter = VK_FILTER_NEAREST;
11396 sampler_ci.minFilter = VK_FILTER_NEAREST;
11397 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11398 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11399 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11400 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11401 sampler_ci.mipLodBias = 1.0;
11402 sampler_ci.anisotropyEnable = VK_FALSE;
11403 sampler_ci.maxAnisotropy = 1;
11404 sampler_ci.compareEnable = VK_FALSE;
11405 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11406 sampler_ci.minLod = 1.0;
11407 sampler_ci.maxLod = 1.0;
11408 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11409 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011410 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011411 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011412 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011413
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011414 VkDescriptorImageInfo info = {};
11415 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011416
11417 VkWriteDescriptorSet descriptor_write;
11418 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011419 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011420 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011421 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011422 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011423 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011424 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011425
11426 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11427
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011428 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011429
Chia-I Wuf7458c52015-10-26 21:10:41 +080011430 vkDestroySampler(m_device->device(), sampler, NULL);
11431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011433}
11434
Karl Schultz6addd812016-02-02 17:17:23 -070011435TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011436 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011437 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011438
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011440
Tony Barbour1fa09702017-03-16 12:09:08 -060011441 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011442 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11443 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011444 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011445 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11446 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011447
11448 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011449 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11450 ds_pool_ci.pNext = NULL;
11451 ds_pool_ci.maxSets = 1;
11452 ds_pool_ci.poolSizeCount = 1;
11453 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011454
11455 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011456 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011457 ASSERT_VK_SUCCESS(err);
11458
11459 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011460 dsl_binding.binding = 0;
11461 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11462 dsl_binding.descriptorCount = 1;
11463 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11464 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011465
11466 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011467 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11468 ds_layout_ci.pNext = NULL;
11469 ds_layout_ci.bindingCount = 1;
11470 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011471 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011472 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011473 ASSERT_VK_SUCCESS(err);
11474
11475 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011476 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011477 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011478 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011479 alloc_info.descriptorPool = ds_pool;
11480 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011481 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011482 ASSERT_VK_SUCCESS(err);
11483
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011484 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011485
11486 VkDescriptorImageInfo descriptor_info;
11487 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11488 descriptor_info.sampler = sampler;
11489
11490 VkWriteDescriptorSet descriptor_write;
11491 memset(&descriptor_write, 0, sizeof(descriptor_write));
11492 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011493 descriptor_write.dstSet = descriptorSet;
11494 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011495 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011496 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11497 descriptor_write.pImageInfo = &descriptor_info;
11498
11499 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11500
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011501 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011502
Chia-I Wuf7458c52015-10-26 21:10:41 +080011503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011505}
11506
Karl Schultz6addd812016-02-02 17:17:23 -070011507TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11508 // Create a single combined Image/Sampler descriptor and send it an invalid
11509 // imageView
11510 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011511
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011513
Tony Barbour1fa09702017-03-16 12:09:08 -060011514 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011515 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011516 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11517 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011518
11519 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011520 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11521 ds_pool_ci.pNext = NULL;
11522 ds_pool_ci.maxSets = 1;
11523 ds_pool_ci.poolSizeCount = 1;
11524 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011525
11526 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011527 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011528 ASSERT_VK_SUCCESS(err);
11529
11530 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011531 dsl_binding.binding = 0;
11532 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11533 dsl_binding.descriptorCount = 1;
11534 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11535 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011536
11537 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011538 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11539 ds_layout_ci.pNext = NULL;
11540 ds_layout_ci.bindingCount = 1;
11541 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011542 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011544 ASSERT_VK_SUCCESS(err);
11545
11546 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011547 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011549 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011550 alloc_info.descriptorPool = ds_pool;
11551 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011553 ASSERT_VK_SUCCESS(err);
11554
11555 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011556 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11557 sampler_ci.pNext = NULL;
11558 sampler_ci.magFilter = VK_FILTER_NEAREST;
11559 sampler_ci.minFilter = VK_FILTER_NEAREST;
11560 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11561 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11562 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11563 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11564 sampler_ci.mipLodBias = 1.0;
11565 sampler_ci.anisotropyEnable = VK_FALSE;
11566 sampler_ci.maxAnisotropy = 1;
11567 sampler_ci.compareEnable = VK_FALSE;
11568 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11569 sampler_ci.minLod = 1.0;
11570 sampler_ci.maxLod = 1.0;
11571 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11572 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011573
11574 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011575 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011576 ASSERT_VK_SUCCESS(err);
11577
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011578 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011579
11580 VkDescriptorImageInfo descriptor_info;
11581 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11582 descriptor_info.sampler = sampler;
11583 descriptor_info.imageView = view;
11584
11585 VkWriteDescriptorSet descriptor_write;
11586 memset(&descriptor_write, 0, sizeof(descriptor_write));
11587 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011588 descriptor_write.dstSet = descriptorSet;
11589 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011590 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011591 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11592 descriptor_write.pImageInfo = &descriptor_info;
11593
11594 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11595
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011596 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011597
Chia-I Wuf7458c52015-10-26 21:10:41 +080011598 vkDestroySampler(m_device->device(), sampler, NULL);
11599 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11600 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011601}
11602
Karl Schultz6addd812016-02-02 17:17:23 -070011603TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11604 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11605 // into the other
11606 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011607
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11609 " binding #1 with type "
11610 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11611 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011612
Tony Barbour1fa09702017-03-16 12:09:08 -060011613 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011614 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011615 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011616 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11617 ds_type_count[0].descriptorCount = 1;
11618 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11619 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011620
11621 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011622 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11623 ds_pool_ci.pNext = NULL;
11624 ds_pool_ci.maxSets = 1;
11625 ds_pool_ci.poolSizeCount = 2;
11626 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011627
11628 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011630 ASSERT_VK_SUCCESS(err);
11631 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011632 dsl_binding[0].binding = 0;
11633 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11634 dsl_binding[0].descriptorCount = 1;
11635 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11636 dsl_binding[0].pImmutableSamplers = NULL;
11637 dsl_binding[1].binding = 1;
11638 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11639 dsl_binding[1].descriptorCount = 1;
11640 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11641 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011642
11643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011644 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11645 ds_layout_ci.pNext = NULL;
11646 ds_layout_ci.bindingCount = 2;
11647 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011648
11649 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011651 ASSERT_VK_SUCCESS(err);
11652
11653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011656 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011657 alloc_info.descriptorPool = ds_pool;
11658 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011660 ASSERT_VK_SUCCESS(err);
11661
11662 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011663 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11664 sampler_ci.pNext = NULL;
11665 sampler_ci.magFilter = VK_FILTER_NEAREST;
11666 sampler_ci.minFilter = VK_FILTER_NEAREST;
11667 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11668 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11669 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11670 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11671 sampler_ci.mipLodBias = 1.0;
11672 sampler_ci.anisotropyEnable = VK_FALSE;
11673 sampler_ci.maxAnisotropy = 1;
11674 sampler_ci.compareEnable = VK_FALSE;
11675 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11676 sampler_ci.minLod = 1.0;
11677 sampler_ci.maxLod = 1.0;
11678 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11679 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011680
11681 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011682 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011683 ASSERT_VK_SUCCESS(err);
11684
11685 VkDescriptorImageInfo info = {};
11686 info.sampler = sampler;
11687
11688 VkWriteDescriptorSet descriptor_write;
11689 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11690 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011691 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011692 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011693 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011694 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11695 descriptor_write.pImageInfo = &info;
11696 // This write update should succeed
11697 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11698 // Now perform a copy update that fails due to type mismatch
11699 VkCopyDescriptorSet copy_ds_update;
11700 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11701 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11702 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011703 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011704 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011705 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11706 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011707 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11708
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011709 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011710 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 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 -060011712 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11713 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11714 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011715 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011716 copy_ds_update.dstSet = descriptorSet;
11717 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011718 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011719 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11720
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011721 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011722
Tobin Ehlis04356f92015-10-27 16:35:27 -060011723 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11725 " binding#1 with offset index of 1 plus "
11726 "update array offset of 0 and update of "
11727 "5 descriptors oversteps total number "
11728 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011729
Tobin Ehlis04356f92015-10-27 16:35:27 -060011730 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11731 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11732 copy_ds_update.srcSet = descriptorSet;
11733 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011734 copy_ds_update.dstSet = descriptorSet;
11735 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011736 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011737 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11738
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011739 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011740
Chia-I Wuf7458c52015-10-26 21:10:41 +080011741 vkDestroySampler(m_device->device(), sampler, NULL);
11742 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11743 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011744}
11745
Karl Schultz6addd812016-02-02 17:17:23 -070011746TEST_F(VkLayerTest, NumSamplesMismatch) {
11747 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11748 // sampleCount
11749 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011750
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011752
Tony Barbour1fa09702017-03-16 12:09:08 -060011753 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011755 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011756 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011757 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011758
11759 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011760 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11761 ds_pool_ci.pNext = NULL;
11762 ds_pool_ci.maxSets = 1;
11763 ds_pool_ci.poolSizeCount = 1;
11764 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011765
Tobin Ehlis3b780662015-05-28 12:11:26 -060011766 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011767 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011768 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011769
Tony Barboureb254902015-07-15 12:50:33 -060011770 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011771 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011772 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011773 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011774 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11775 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011776
Tony Barboureb254902015-07-15 12:50:33 -060011777 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11778 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11779 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011780 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011781 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011782
Tobin Ehlis3b780662015-05-28 12:11:26 -060011783 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011784 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011785 ASSERT_VK_SUCCESS(err);
11786
11787 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011788 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011789 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011790 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011791 alloc_info.descriptorPool = ds_pool;
11792 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011793 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011794 ASSERT_VK_SUCCESS(err);
11795
Tony Barboureb254902015-07-15 12:50:33 -060011796 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011797 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011798 pipe_ms_state_ci.pNext = NULL;
11799 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11800 pipe_ms_state_ci.sampleShadingEnable = 0;
11801 pipe_ms_state_ci.minSampleShading = 1.0;
11802 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011803
Tony Barboureb254902015-07-15 12:50:33 -060011804 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011805 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11806 pipeline_layout_ci.pNext = NULL;
11807 pipeline_layout_ci.setLayoutCount = 1;
11808 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011809
11810 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011811 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011812 ASSERT_VK_SUCCESS(err);
11813
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011814 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011815 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 -060011816 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011817 VkPipelineObj pipe(m_device);
11818 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011819 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011820 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011821 pipe.SetMSAA(&pipe_ms_state_ci);
11822 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011823
Tony Barbour552f6c02016-12-21 14:34:07 -070011824 m_commandBuffer->BeginCommandBuffer();
11825 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011826 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011827
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011828 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11829 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11830 VkRect2D scissor = {{0, 0}, {16, 16}};
11831 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11832
Mark Young29927482016-05-04 14:38:51 -060011833 // Render triangle (the error should trigger on the attempt to draw).
11834 Draw(3, 1, 0, 0);
11835
11836 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011837 m_commandBuffer->EndRenderPass();
11838 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011839
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011840 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011841
Chia-I Wuf7458c52015-10-26 21:10:41 +080011842 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11843 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11844 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011845}
Mark Young29927482016-05-04 14:38:51 -060011846
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011847TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011848 TEST_DESCRIPTION(
11849 "Hit RenderPass incompatible cases. "
11850 "Initial case is drawing with an active renderpass that's "
11851 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011852 VkResult err;
11853
Tony Barbour1fa09702017-03-16 12:09:08 -060011854 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11856
11857 VkDescriptorSetLayoutBinding dsl_binding = {};
11858 dsl_binding.binding = 0;
11859 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11860 dsl_binding.descriptorCount = 1;
11861 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11862 dsl_binding.pImmutableSamplers = NULL;
11863
11864 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11865 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11866 ds_layout_ci.pNext = NULL;
11867 ds_layout_ci.bindingCount = 1;
11868 ds_layout_ci.pBindings = &dsl_binding;
11869
11870 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011871 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011872 ASSERT_VK_SUCCESS(err);
11873
11874 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11875 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11876 pipeline_layout_ci.pNext = NULL;
11877 pipeline_layout_ci.setLayoutCount = 1;
11878 pipeline_layout_ci.pSetLayouts = &ds_layout;
11879
11880 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011881 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011882 ASSERT_VK_SUCCESS(err);
11883
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011884 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011885 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 -060011886 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011887 // Create a renderpass that will be incompatible with default renderpass
11888 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011889 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011890 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011891 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011892 VkSubpassDescription subpass = {};
11893 subpass.inputAttachmentCount = 1;
11894 subpass.pInputAttachments = &attach;
11895 subpass.colorAttachmentCount = 1;
11896 subpass.pColorAttachments = &color_att;
11897 VkRenderPassCreateInfo rpci = {};
11898 rpci.subpassCount = 1;
11899 rpci.pSubpasses = &subpass;
11900 rpci.attachmentCount = 1;
11901 VkAttachmentDescription attach_desc = {};
11902 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011903 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11904 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011905 rpci.pAttachments = &attach_desc;
11906 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11907 VkRenderPass rp;
11908 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11909 VkPipelineObj pipe(m_device);
11910 pipe.AddShader(&vs);
11911 pipe.AddShader(&fs);
11912 pipe.AddColorAttachment();
11913 VkViewport view_port = {};
11914 m_viewports.push_back(view_port);
11915 pipe.SetViewport(m_viewports);
11916 VkRect2D rect = {};
11917 m_scissors.push_back(rect);
11918 pipe.SetScissor(m_scissors);
11919 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11920
11921 VkCommandBufferInheritanceInfo cbii = {};
11922 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11923 cbii.renderPass = rp;
11924 cbii.subpass = 0;
11925 VkCommandBufferBeginInfo cbbi = {};
11926 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11927 cbbi.pInheritanceInfo = &cbii;
11928 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11929 VkRenderPassBeginInfo rpbi = {};
11930 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11931 rpbi.framebuffer = m_framebuffer;
11932 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011933 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11934 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011935
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011937 // Render triangle (the error should trigger on the attempt to draw).
11938 Draw(3, 1, 0, 0);
11939
11940 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011941 m_commandBuffer->EndRenderPass();
11942 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011943
11944 m_errorMonitor->VerifyFound();
11945
11946 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11947 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11948 vkDestroyRenderPass(m_device->device(), rp, NULL);
11949}
11950
Mark Youngc89c6312016-03-31 16:03:20 -060011951TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11952 // Create Pipeline where the number of blend attachments doesn't match the
11953 // number of color attachments. In this case, we don't add any color
11954 // blend attachments even though we have a color attachment.
11955 VkResult err;
11956
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011958
Tony Barbour1fa09702017-03-16 12:09:08 -060011959 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11961 VkDescriptorPoolSize ds_type_count = {};
11962 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11963 ds_type_count.descriptorCount = 1;
11964
11965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11967 ds_pool_ci.pNext = NULL;
11968 ds_pool_ci.maxSets = 1;
11969 ds_pool_ci.poolSizeCount = 1;
11970 ds_pool_ci.pPoolSizes = &ds_type_count;
11971
11972 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011973 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011974 ASSERT_VK_SUCCESS(err);
11975
11976 VkDescriptorSetLayoutBinding dsl_binding = {};
11977 dsl_binding.binding = 0;
11978 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11979 dsl_binding.descriptorCount = 1;
11980 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11981 dsl_binding.pImmutableSamplers = NULL;
11982
11983 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11984 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11985 ds_layout_ci.pNext = NULL;
11986 ds_layout_ci.bindingCount = 1;
11987 ds_layout_ci.pBindings = &dsl_binding;
11988
11989 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011990 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011991 ASSERT_VK_SUCCESS(err);
11992
11993 VkDescriptorSet descriptorSet;
11994 VkDescriptorSetAllocateInfo alloc_info = {};
11995 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11996 alloc_info.descriptorSetCount = 1;
11997 alloc_info.descriptorPool = ds_pool;
11998 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011999 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060012000 ASSERT_VK_SUCCESS(err);
12001
12002 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012003 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060012004 pipe_ms_state_ci.pNext = NULL;
12005 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12006 pipe_ms_state_ci.sampleShadingEnable = 0;
12007 pipe_ms_state_ci.minSampleShading = 1.0;
12008 pipe_ms_state_ci.pSampleMask = NULL;
12009
12010 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12011 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12012 pipeline_layout_ci.pNext = NULL;
12013 pipeline_layout_ci.setLayoutCount = 1;
12014 pipeline_layout_ci.pSetLayouts = &ds_layout;
12015
12016 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060012018 ASSERT_VK_SUCCESS(err);
12019
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012020 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012021 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 -060012022 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060012023 VkPipelineObj pipe(m_device);
12024 pipe.AddShader(&vs);
12025 pipe.AddShader(&fs);
12026 pipe.SetMSAA(&pipe_ms_state_ci);
12027 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012028 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060012029
12030 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12031 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12032 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12033}
Mark Young29927482016-05-04 14:38:51 -060012034
Mark Muellerd4914412016-06-13 17:52:06 -060012035TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012036 TEST_DESCRIPTION(
12037 "Points to a wrong colorAttachment index in a VkClearAttachment "
12038 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060012039 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060012041
12042 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
12043 m_errorMonitor->VerifyFound();
12044}
12045
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012046TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012047 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
12048 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012049
Tony Barbour1fa09702017-03-16 12:09:08 -060012050 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012052
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012053 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012054 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12055 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012056
12057 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012058 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12059 ds_pool_ci.pNext = NULL;
12060 ds_pool_ci.maxSets = 1;
12061 ds_pool_ci.poolSizeCount = 1;
12062 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012063
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012064 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012065 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012066 ASSERT_VK_SUCCESS(err);
12067
Tony Barboureb254902015-07-15 12:50:33 -060012068 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012069 dsl_binding.binding = 0;
12070 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12071 dsl_binding.descriptorCount = 1;
12072 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12073 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012074
Tony Barboureb254902015-07-15 12:50:33 -060012075 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012076 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12077 ds_layout_ci.pNext = NULL;
12078 ds_layout_ci.bindingCount = 1;
12079 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012080
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012081 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012082 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012083 ASSERT_VK_SUCCESS(err);
12084
12085 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012086 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012087 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012088 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012089 alloc_info.descriptorPool = ds_pool;
12090 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012091 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012092 ASSERT_VK_SUCCESS(err);
12093
Tony Barboureb254902015-07-15 12:50:33 -060012094 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012095 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012096 pipe_ms_state_ci.pNext = NULL;
12097 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12098 pipe_ms_state_ci.sampleShadingEnable = 0;
12099 pipe_ms_state_ci.minSampleShading = 1.0;
12100 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012101
Tony Barboureb254902015-07-15 12:50:33 -060012102 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012103 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12104 pipeline_layout_ci.pNext = NULL;
12105 pipeline_layout_ci.setLayoutCount = 1;
12106 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012107
12108 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012109 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012110 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012111
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012112 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012113 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012114 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012115 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012116
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012117 VkPipelineObj pipe(m_device);
12118 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012119 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070012120 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012121 pipe.SetMSAA(&pipe_ms_state_ci);
12122 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012123
Tony Barbour552f6c02016-12-21 14:34:07 -070012124 m_commandBuffer->BeginCommandBuffer();
12125 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012126
Karl Schultz6addd812016-02-02 17:17:23 -070012127 // Main thing we care about for this test is that the VkImage obj we're
12128 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012129 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012130 VkClearAttachment color_attachment;
12131 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12132 color_attachment.clearValue.color.float32[0] = 1.0;
12133 color_attachment.clearValue.color.float32[1] = 1.0;
12134 color_attachment.clearValue.color.float32[2] = 1.0;
12135 color_attachment.clearValue.color.float32[3] = 1.0;
12136 color_attachment.colorAttachment = 0;
Dave Houlton8e157032017-05-22 16:16:27 -060012137 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}, 0, 1};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012138
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012139 // Call for full-sized FB Color attachment prior to issuing a Draw
12140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012141 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012142 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012143 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012144
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012145 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
12146 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
12147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
12148 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
12149 m_errorMonitor->VerifyFound();
12150
Dave Houlton8e157032017-05-22 16:16:27 -060012151 // baseLayer >= view layers
12152 clear_rect.rect.extent.width = (uint32_t)m_width;
12153 clear_rect.baseArrayLayer = 1;
12154 clear_rect.layerCount = 0;
12155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
12156 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
12157 m_errorMonitor->VerifyFound();
12158
12159 // baseLayer + layerCount > view layers
12160 clear_rect.rect.extent.width = (uint32_t)m_width;
12161 clear_rect.baseArrayLayer = 0;
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012162 clear_rect.layerCount = 2;
12163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
12164 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012165 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012166
Chia-I Wuf7458c52015-10-26 21:10:41 +080012167 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012170}
12171
Karl Schultz6addd812016-02-02 17:17:23 -070012172TEST_F(VkLayerTest, VtxBufferBadIndex) {
12173 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012174
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12176 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012177
Tony Barbour1fa09702017-03-16 12:09:08 -060012178 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012179 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012181
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12184 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012185
12186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12188 ds_pool_ci.pNext = NULL;
12189 ds_pool_ci.maxSets = 1;
12190 ds_pool_ci.poolSizeCount = 1;
12191 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012192
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012193 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012194 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012195 ASSERT_VK_SUCCESS(err);
12196
Tony Barboureb254902015-07-15 12:50:33 -060012197 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012198 dsl_binding.binding = 0;
12199 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12200 dsl_binding.descriptorCount = 1;
12201 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12202 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012203
Tony Barboureb254902015-07-15 12:50:33 -060012204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12206 ds_layout_ci.pNext = NULL;
12207 ds_layout_ci.bindingCount = 1;
12208 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012209
Tobin Ehlis502480b2015-06-24 15:53:07 -060012210 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012212 ASSERT_VK_SUCCESS(err);
12213
12214 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012215 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012216 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012217 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012218 alloc_info.descriptorPool = ds_pool;
12219 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012220 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012221 ASSERT_VK_SUCCESS(err);
12222
Tony Barboureb254902015-07-15 12:50:33 -060012223 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012224 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012225 pipe_ms_state_ci.pNext = NULL;
12226 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12227 pipe_ms_state_ci.sampleShadingEnable = 0;
12228 pipe_ms_state_ci.minSampleShading = 1.0;
12229 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012230
Tony Barboureb254902015-07-15 12:50:33 -060012231 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012232 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12233 pipeline_layout_ci.pNext = NULL;
12234 pipeline_layout_ci.setLayoutCount = 1;
12235 pipeline_layout_ci.pSetLayouts = &ds_layout;
12236 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012237
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012238 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012239 ASSERT_VK_SUCCESS(err);
12240
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012241 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012242 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 -060012243 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012244 VkPipelineObj pipe(m_device);
12245 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012246 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012247 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012248 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012249 pipe.SetViewport(m_viewports);
12250 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012251 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012252
Tony Barbour552f6c02016-12-21 14:34:07 -070012253 m_commandBuffer->BeginCommandBuffer();
12254 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012255 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012256 // Don't care about actual data, just need to get to draw to flag error
12257 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012258 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012259 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012260 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012261
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012262 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012263
Chia-I Wuf7458c52015-10-26 21:10:41 +080012264 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12265 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12266 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012267}
Mark Muellerdfe37552016-07-07 14:47:42 -060012268
Mark Mueller2ee294f2016-08-04 12:59:48 -060012269TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012270 TEST_DESCRIPTION(
12271 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12272 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012273 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012274
Mark Mueller880fce52016-08-17 15:23:23 -060012275 // The following test fails with recent NVidia drivers.
12276 // By the time core_validation is reached, the NVidia
12277 // driver has sanitized the invalid condition and core_validation
12278 // is not introduced to the failure condition. This is not the case
12279 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012280 // uint32_t count = static_cast<uint32_t>(~0);
12281 // VkPhysicalDevice physical_device;
12282 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12283 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012284
Mark Mueller2ee294f2016-08-04 12:59:48 -060012285 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012286 VkDeviceQueueCreateInfo queue_create_info = {};
12287 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12288 queue_create_info.queueCount = 1;
12289 queue_create_info.pQueuePriorities = &queue_priority;
12290 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12291
12292 VkPhysicalDeviceFeatures features = m_device->phy().features();
12293 VkDevice testDevice;
12294 VkDeviceCreateInfo device_create_info = {};
12295 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12296 device_create_info.queueCreateInfoCount = 1;
12297 device_create_info.pQueueCreateInfos = &queue_create_info;
12298 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012299
Petr Kraus56ed9192017-05-08 23:45:36 +020012300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00054);
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012301 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12302 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12303 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012304 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12305 m_errorMonitor->VerifyFound();
12306
12307 queue_create_info.queueFamilyIndex = 1;
Tobin Ehliscc980e12017-05-19 12:05:49 -060012308 if (m_device->phy().queue_properties().size() < 2) {
12309 queue_create_info.queueFamilyIndex = 0;
12310 }
Mark Mueller2ee294f2016-08-04 12:59:48 -060012311
12312 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12313 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12314 for (unsigned i = 0; i < feature_count; i++) {
12315 if (VK_FALSE == feature_array[i]) {
12316 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012317 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12319 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012320 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12321 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12322 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12324 "You requested features that are unavailable on this device. You should first "
12325 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012326 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12327 m_errorMonitor->VerifyFound();
12328 break;
12329 }
12330 }
12331}
12332
Tobin Ehlis16edf082016-11-21 12:33:49 -070012333TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12334 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12335
Tony Barbour1fa09702017-03-16 12:09:08 -060012336 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012337
12338 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12339 std::vector<VkDeviceQueueCreateInfo> queue_info;
12340 queue_info.reserve(queue_props.size());
12341 std::vector<std::vector<float>> queue_priorities;
12342 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12343 VkDeviceQueueCreateInfo qi{};
12344 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12345 qi.queueFamilyIndex = i;
12346 qi.queueCount = queue_props[i].queueCount;
12347 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12348 qi.pQueuePriorities = queue_priorities[i].data();
12349 queue_info.push_back(qi);
12350 }
12351
12352 std::vector<const char *> device_extension_names;
12353
12354 VkDevice local_device;
12355 VkDeviceCreateInfo device_create_info = {};
12356 auto features = m_device->phy().features();
12357 // Intentionally disable pipeline stats
12358 features.pipelineStatisticsQuery = VK_FALSE;
12359 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12360 device_create_info.pNext = NULL;
12361 device_create_info.queueCreateInfoCount = queue_info.size();
12362 device_create_info.pQueueCreateInfos = queue_info.data();
12363 device_create_info.enabledLayerCount = 0;
12364 device_create_info.ppEnabledLayerNames = NULL;
12365 device_create_info.pEnabledFeatures = &features;
12366 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12367 ASSERT_VK_SUCCESS(err);
12368
12369 VkQueryPoolCreateInfo qpci{};
12370 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12371 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12372 qpci.queryCount = 1;
12373 VkQueryPool query_pool;
12374
12375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12376 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12377 m_errorMonitor->VerifyFound();
12378
12379 vkDestroyDevice(local_device, nullptr);
12380}
12381
Mark Mueller2ee294f2016-08-04 12:59:48 -060012382TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012383 TEST_DESCRIPTION(
12384 "Use an invalid queue index in a vkCmdWaitEvents call."
12385 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012386
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012387 const char *invalid_queue_index =
12388 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12389 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12390 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012395
Tony Barbour1fa09702017-03-16 12:09:08 -060012396 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012397
12398 VkEvent event;
12399 VkEventCreateInfo event_create_info{};
12400 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12401 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12402
Mark Mueller2ee294f2016-08-04 12:59:48 -060012403 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012405
Tony Barbour552f6c02016-12-21 14:34:07 -070012406 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012407
12408 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012409 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 -060012410 ASSERT_TRUE(image.initialized());
12411 VkImageMemoryBarrier img_barrier = {};
12412 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12413 img_barrier.pNext = NULL;
12414 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12415 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12416 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12417 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12418 img_barrier.image = image.handle();
12419 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012420
12421 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12422 // that layer validation catches the case when it is not.
12423 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012424 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12425 img_barrier.subresourceRange.baseArrayLayer = 0;
12426 img_barrier.subresourceRange.baseMipLevel = 0;
12427 img_barrier.subresourceRange.layerCount = 1;
12428 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012429 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12430 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012431 m_errorMonitor->VerifyFound();
12432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012434
12435 VkQueryPool query_pool;
12436 VkQueryPoolCreateInfo query_pool_create_info = {};
12437 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12438 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12439 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012440 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012441
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012442 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012443 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12444
12445 vkEndCommandBuffer(m_commandBuffer->handle());
12446 m_errorMonitor->VerifyFound();
12447
12448 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12449 vkDestroyEvent(m_device->device(), event, nullptr);
12450}
12451
Mark Muellerdfe37552016-07-07 14:47:42 -060012452TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012453 TEST_DESCRIPTION(
12454 "Submit a command buffer using deleted vertex buffer, "
12455 "delete a buffer twice, use an invalid offset for each "
12456 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012457
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012458 const char *deleted_buffer_in_command_buffer =
12459 "Cannot submit cmd buffer "
12460 "using deleted buffer ";
12461 const char *invalid_offset_message =
12462 "vkBindBufferMemory(): "
12463 "memoryOffset is 0x";
12464 const char *invalid_storage_buffer_offset_message =
12465 "vkBindBufferMemory(): "
12466 "storage memoryOffset "
12467 "is 0x";
12468 const char *invalid_texel_buffer_offset_message =
12469 "vkBindBufferMemory(): "
12470 "texel memoryOffset "
12471 "is 0x";
12472 const char *invalid_uniform_buffer_offset_message =
12473 "vkBindBufferMemory(): "
12474 "uniform memoryOffset "
12475 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012476
Tony Barbour1fa09702017-03-16 12:09:08 -060012477 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012478 ASSERT_NO_FATAL_FAILURE(InitViewport());
12479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12480
12481 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012482 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012483 pipe_ms_state_ci.pNext = NULL;
12484 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12485 pipe_ms_state_ci.sampleShadingEnable = 0;
12486 pipe_ms_state_ci.minSampleShading = 1.0;
12487 pipe_ms_state_ci.pSampleMask = nullptr;
12488
12489 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12490 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12491 VkPipelineLayout pipeline_layout;
12492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012493 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012494 ASSERT_VK_SUCCESS(err);
12495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012496 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12497 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012498 VkPipelineObj pipe(m_device);
12499 pipe.AddShader(&vs);
12500 pipe.AddShader(&fs);
12501 pipe.AddColorAttachment();
12502 pipe.SetMSAA(&pipe_ms_state_ci);
12503 pipe.SetViewport(m_viewports);
12504 pipe.SetScissor(m_scissors);
12505 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12506
Tony Barbour552f6c02016-12-21 14:34:07 -070012507 m_commandBuffer->BeginCommandBuffer();
12508 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012509 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012510
12511 {
12512 // Create and bind a vertex buffer in a reduced scope, which will cause
12513 // it to be deleted upon leaving this scope
12514 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012515 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012516 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12517 draw_verticies.AddVertexInputToPipe(pipe);
12518 }
12519
12520 Draw(1, 0, 0, 0);
12521
Tony Barbour552f6c02016-12-21 14:34:07 -070012522 m_commandBuffer->EndRenderPass();
12523 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012524
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012526 QueueCommandBuffer(false);
12527 m_errorMonitor->VerifyFound();
12528
12529 {
12530 // Create and bind a vertex buffer in a reduced scope, and delete it
12531 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012532 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012534 buffer_test.TestDoubleDestroy();
12535 }
12536 m_errorMonitor->VerifyFound();
12537
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012538 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012539 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012540 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012542 m_errorMonitor->SetUnexpectedError(
12543 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12544 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012545 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12546 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012547 m_errorMonitor->VerifyFound();
12548 }
12549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012550 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12551 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012552 // Create and bind a memory buffer with an invalid offset again,
12553 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012555 m_errorMonitor->SetUnexpectedError(
12556 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12557 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012558 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12559 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012560 m_errorMonitor->VerifyFound();
12561 }
12562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012563 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012564 // Create and bind a memory buffer with an invalid offset again, but
12565 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012567 m_errorMonitor->SetUnexpectedError(
12568 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12569 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12571 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012572 m_errorMonitor->VerifyFound();
12573 }
12574
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012575 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012576 // Create and bind a memory buffer with an invalid offset again, but
12577 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012579 m_errorMonitor->SetUnexpectedError(
12580 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12581 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012582 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12583 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012584 m_errorMonitor->VerifyFound();
12585 }
12586
12587 {
12588 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012590 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12591 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12593 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012594 m_errorMonitor->VerifyFound();
12595 }
12596
12597 {
12598 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012600 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12601 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012602 }
12603 m_errorMonitor->VerifyFound();
12604
12605 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12606}
12607
Tony Barbourff1351e2017-05-10 11:14:03 -060012608TEST_F(VkLayerTest, BadVertexBufferOffset) {
12609 TEST_DESCRIPTION("Submit an offset past the end of a vertex buffer");
12610
12611 ASSERT_NO_FATAL_FAILURE(Init());
12612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12613 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Tony Barboure94224e2017-05-11 15:22:43 -060012614 VkConstantBufferObj vbo(m_device, 3, sizeof(float), (const void *)&vbo_data);
Tony Barbourff1351e2017-05-10 11:14:03 -060012615 m_commandBuffer->BeginCommandBuffer();
12616 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
12617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01417);
Tony Barboure94224e2017-05-11 15:22:43 -060012618 BindVertexBuffer(&vbo, (VkDeviceSize)(3 * sizeof(float)), 1); // Offset at the end of the buffer
Tony Barbourff1351e2017-05-10 11:14:03 -060012619 m_errorMonitor->VerifyFound();
12620}
12621
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012622// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12623TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012624 TEST_DESCRIPTION(
12625 "Hit all possible validation checks associated with the "
12626 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12627 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012628 // 3 in ValidateCmdBufImageLayouts
12629 // * -1 Attempt to submit cmd buf w/ deleted image
12630 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12631 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012632
Tony Barbour1fa09702017-03-16 12:09:08 -060012633 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012634 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012635 if (!depth_format) {
12636 printf(" No Depth + Stencil format found. Skipped.\n");
12637 return;
12638 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012639 // Create src & dst images to use for copy operations
12640 VkImage src_image;
12641 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012642 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012643
12644 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12645 const int32_t tex_width = 32;
12646 const int32_t tex_height = 32;
12647
12648 VkImageCreateInfo image_create_info = {};
12649 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12650 image_create_info.pNext = NULL;
12651 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12652 image_create_info.format = tex_format;
12653 image_create_info.extent.width = tex_width;
12654 image_create_info.extent.height = tex_height;
12655 image_create_info.extent.depth = 1;
12656 image_create_info.mipLevels = 1;
12657 image_create_info.arrayLayers = 4;
12658 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12659 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12660 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012661 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012662 image_create_info.flags = 0;
12663
12664 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12665 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012666 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012667 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12668 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012669 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12670 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12671 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12672 ASSERT_VK_SUCCESS(err);
12673
12674 // Allocate memory
12675 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012676 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012677 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012678 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12679 mem_alloc.pNext = NULL;
12680 mem_alloc.allocationSize = 0;
12681 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012682
12683 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012684 mem_alloc.allocationSize = img_mem_reqs.size;
12685 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012686 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012687 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012688 ASSERT_VK_SUCCESS(err);
12689
12690 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012691 mem_alloc.allocationSize = img_mem_reqs.size;
12692 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012693 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012694 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012695 ASSERT_VK_SUCCESS(err);
12696
12697 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012698 mem_alloc.allocationSize = img_mem_reqs.size;
12699 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012700 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012701 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012702 ASSERT_VK_SUCCESS(err);
12703
12704 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12705 ASSERT_VK_SUCCESS(err);
12706 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12707 ASSERT_VK_SUCCESS(err);
12708 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12709 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012710
Tony Barbour552f6c02016-12-21 14:34:07 -070012711 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012712 VkImageCopy copy_region;
12713 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12714 copy_region.srcSubresource.mipLevel = 0;
12715 copy_region.srcSubresource.baseArrayLayer = 0;
12716 copy_region.srcSubresource.layerCount = 1;
12717 copy_region.srcOffset.x = 0;
12718 copy_region.srcOffset.y = 0;
12719 copy_region.srcOffset.z = 0;
12720 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12721 copy_region.dstSubresource.mipLevel = 0;
12722 copy_region.dstSubresource.baseArrayLayer = 0;
12723 copy_region.dstSubresource.layerCount = 1;
12724 copy_region.dstOffset.x = 0;
12725 copy_region.dstOffset.y = 0;
12726 copy_region.dstOffset.z = 0;
12727 copy_region.extent.width = 1;
12728 copy_region.extent.height = 1;
12729 copy_region.extent.depth = 1;
12730
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12732 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12733 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012734
Cort530cf382016-12-08 09:59:47 -080012735 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 -060012736 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012737 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12738 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012739 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12740 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012741 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 -060012742 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012744 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12745 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskic61e1da2017-05-15 16:18:13 -060012746 m_errorMonitor->SetUnexpectedError("is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT");
Cort530cf382016-12-08 09:59:47 -080012747 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 -060012748 m_errorMonitor->VerifyFound();
12749 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012751 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012752 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012753 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012754 "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 -080012755 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 -060012756 m_errorMonitor->VerifyFound();
12757 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12759 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12760 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012761 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 -060012762 m_errorMonitor->VerifyFound();
12763 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012765 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012766 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012767 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012768 "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 -080012769 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 -060012770 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012772 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12773 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012774 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012775 "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 -080012776 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 -060012777 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012778
Cort3b021012016-12-07 12:00:57 -080012779 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12780 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12781 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12782 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12783 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12784 transfer_dst_image_barrier[0].srcAccessMask = 0;
12785 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12786 transfer_dst_image_barrier[0].image = dst_image;
12787 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12788 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12789 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12790 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12791 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12792 transfer_dst_image_barrier[0].image = depth_image;
12793 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12794 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12795 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12796
12797 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012798 VkClearColorValue color_clear_value = {};
12799 VkImageSubresourceRange clear_range;
12800 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12801 clear_range.baseMipLevel = 0;
12802 clear_range.baseArrayLayer = 0;
12803 clear_range.layerCount = 1;
12804 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012805
Cort3b021012016-12-07 12:00:57 -080012806 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12807 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012810 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012811 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012812 // Fail due to provided layout not matching actual current layout for color clear.
12813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012814 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012815 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012816
Cort530cf382016-12-08 09:59:47 -080012817 VkClearDepthStencilValue depth_clear_value = {};
12818 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012819
12820 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12821 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012824 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012825 m_errorMonitor->VerifyFound();
12826 // Fail due to provided layout not matching actual current layout for depth clear.
12827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012828 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012829 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012830
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012831 // Now cause error due to bad image layout transition in PipelineBarrier
12832 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012833 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012834 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012835 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012836 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012837 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12838 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012839 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012841 "you cannot transition the layout of aspect 1 from "
12842 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12843 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012845 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12846 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012847 m_errorMonitor->VerifyFound();
12848
12849 // Finally some layout errors at RenderPass create time
12850 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12851 VkAttachmentReference attach = {};
12852 // perf warning for GENERAL layout w/ non-DS input attachment
12853 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12854 VkSubpassDescription subpass = {};
12855 subpass.inputAttachmentCount = 1;
12856 subpass.pInputAttachments = &attach;
12857 VkRenderPassCreateInfo rpci = {};
12858 rpci.subpassCount = 1;
12859 rpci.pSubpasses = &subpass;
12860 rpci.attachmentCount = 1;
12861 VkAttachmentDescription attach_desc = {};
12862 attach_desc.format = VK_FORMAT_UNDEFINED;
12863 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012864 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012865 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12867 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012868 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12869 m_errorMonitor->VerifyFound();
12870 // error w/ non-general layout
12871 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12872
12873 m_errorMonitor->SetDesiredFailureMsg(
12874 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12875 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12876 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12877 m_errorMonitor->VerifyFound();
12878 subpass.inputAttachmentCount = 0;
12879 subpass.colorAttachmentCount = 1;
12880 subpass.pColorAttachments = &attach;
12881 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12882 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12884 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012885 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12886 m_errorMonitor->VerifyFound();
12887 // error w/ non-color opt or GENERAL layout for color attachment
12888 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12889 m_errorMonitor->SetDesiredFailureMsg(
12890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12891 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12892 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12893 m_errorMonitor->VerifyFound();
12894 subpass.colorAttachmentCount = 0;
12895 subpass.pDepthStencilAttachment = &attach;
12896 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12897 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12899 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012900 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12901 m_errorMonitor->VerifyFound();
12902 // error w/ non-ds opt or GENERAL layout for color attachment
12903 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12905 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12906 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012907 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12908 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012909 // For this error we need a valid renderpass so create default one
12910 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12911 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012912 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012913 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12914 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12915 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12916 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12917 // Can't do a CLEAR load on READ_ONLY initialLayout
12918 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12919 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12920 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012922 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012923 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12924 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012925
Cort3b021012016-12-07 12:00:57 -080012926 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12927 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12928 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012929 vkDestroyImage(m_device->device(), src_image, NULL);
12930 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012931 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012932}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012933
Tobin Ehlise0936662016-10-11 08:10:51 -060012934TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12935 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12936 VkResult err;
12937
Tony Barbour1fa09702017-03-16 12:09:08 -060012938 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012939
12940 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12941 VkImageTiling tiling;
12942 VkFormatProperties format_properties;
12943 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12944 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12945 tiling = VK_IMAGE_TILING_LINEAR;
12946 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12947 tiling = VK_IMAGE_TILING_OPTIMAL;
12948 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012949 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012950 return;
12951 }
12952
12953 VkDescriptorPoolSize ds_type = {};
12954 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12955 ds_type.descriptorCount = 1;
12956
12957 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12958 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12959 ds_pool_ci.maxSets = 1;
12960 ds_pool_ci.poolSizeCount = 1;
12961 ds_pool_ci.pPoolSizes = &ds_type;
12962 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12963
12964 VkDescriptorPool ds_pool;
12965 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12966 ASSERT_VK_SUCCESS(err);
12967
12968 VkDescriptorSetLayoutBinding dsl_binding = {};
12969 dsl_binding.binding = 0;
12970 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12971 dsl_binding.descriptorCount = 1;
12972 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12973 dsl_binding.pImmutableSamplers = NULL;
12974
12975 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12976 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12977 ds_layout_ci.pNext = NULL;
12978 ds_layout_ci.bindingCount = 1;
12979 ds_layout_ci.pBindings = &dsl_binding;
12980
12981 VkDescriptorSetLayout ds_layout;
12982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12983 ASSERT_VK_SUCCESS(err);
12984
12985 VkDescriptorSetAllocateInfo alloc_info = {};
12986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12987 alloc_info.descriptorSetCount = 1;
12988 alloc_info.descriptorPool = ds_pool;
12989 alloc_info.pSetLayouts = &ds_layout;
12990 VkDescriptorSet descriptor_set;
12991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12992 ASSERT_VK_SUCCESS(err);
12993
12994 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12995 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12996 pipeline_layout_ci.pNext = NULL;
12997 pipeline_layout_ci.setLayoutCount = 1;
12998 pipeline_layout_ci.pSetLayouts = &ds_layout;
12999 VkPipelineLayout pipeline_layout;
13000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13001 ASSERT_VK_SUCCESS(err);
13002
13003 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013004 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060013005 ASSERT_TRUE(image.initialized());
13006 VkImageView view = image.targetView(tex_format);
13007
13008 VkDescriptorImageInfo image_info = {};
13009 image_info.imageView = view;
13010 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13011
13012 VkWriteDescriptorSet descriptor_write = {};
13013 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13014 descriptor_write.dstSet = descriptor_set;
13015 descriptor_write.dstBinding = 0;
13016 descriptor_write.descriptorCount = 1;
13017 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
13018 descriptor_write.pImageInfo = &image_info;
13019
13020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13021 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
13022 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
13023 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13024 m_errorMonitor->VerifyFound();
13025
13026 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13027 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13028 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
13029 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13030}
13031
Chris Forbes3fa68552017-05-18 14:34:05 -070013032TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
Tony Barbour1fa09702017-03-16 12:09:08 -060013033 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fa68552017-05-18 14:34:05 -070013034 const char *simultaneous_use_message =
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013035 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
13036 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060013037
Chris Forbes3fa68552017-05-18 14:34:05 -070013038 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
Mark Mueller93b938f2016-08-18 10:27:40 -060013039
Chris Forbes3fa68552017-05-18 14:34:05 -070013040 secondary.begin();
13041 secondary.end();
Rene Lindsay24cf6c52017-01-04 12:06:59 -070013042
Chris Forbes3fa68552017-05-18 14:34:05 -070013043 VkCommandBufferBeginInfo cbbi = {
13044 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
13045 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr,
13046 };
Mark Mueller93b938f2016-08-18 10:27:40 -060013047
Chris Forbes3fa68552017-05-18 14:34:05 -070013048 m_commandBuffer->begin(&cbbi);
13049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message);
13050 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013051 m_errorMonitor->VerifyFound();
Chris Forbes3fa68552017-05-18 14:34:05 -070013052 m_commandBuffer->end();
13053}
Mark Mueller93b938f2016-08-18 10:27:40 -060013054
Chris Forbes3fa68552017-05-18 14:34:05 -070013055TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
13056 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060013057
Chris Forbes3fa68552017-05-18 14:34:05 -070013058 const char *simultaneous_use_message = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Mueller4042b652016-09-05 22:52:21 -060013059
Chris Forbes3fa68552017-05-18 14:34:05 -070013060 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
13061
13062 VkCommandBufferInheritanceInfo inh = {
13063 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, nullptr,
13064 };
13065 VkCommandBufferBeginInfo cbbi = {
13066 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
13067 0, &inh
13068 };
13069
13070 secondary.begin(&cbbi);
13071 secondary.end();
13072
13073 m_commandBuffer->begin();
13074 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
13075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
13076 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013077 m_errorMonitor->VerifyFound();
Chris Forbes3fa68552017-05-18 14:34:05 -070013078 m_commandBuffer->end();
13079}
Rene Lindsay24cf6c52017-01-04 12:06:59 -070013080
Chris Forbes3fa68552017-05-18 14:34:05 -070013081TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
13082 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013083
Chris Forbes3fa68552017-05-18 14:34:05 -070013084 // variation on previous test executing the same CB twice in the same
13085 // CmdExecuteCommands call
13086
13087 const char *simultaneous_use_message = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
13088
13089 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
13090
13091 VkCommandBufferInheritanceInfo inh = {
13092 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, nullptr,
13093 };
13094 VkCommandBufferBeginInfo cbbi = {
13095 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
13096 0, &inh
13097 };
13098
13099 secondary.begin(&cbbi);
13100 secondary.end();
13101
13102 m_commandBuffer->begin();
13103 VkCommandBuffer cbs[] = { secondary.handle(), secondary.handle() };
13104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
13105 vkCmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
13106 m_errorMonitor->VerifyFound();
13107 m_commandBuffer->end();
Mark Mueller93b938f2016-08-18 10:27:40 -060013108}
13109
Tony Barbour626994c2017-02-08 15:29:37 -070013110TEST_F(VkLayerTest, SimultaneousUseOneShot) {
13111 TEST_DESCRIPTION(
13112 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
13113 "errors");
13114 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
13115 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 -060013116 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070013117
13118 VkCommandBuffer cmd_bufs[2];
13119 VkCommandBufferAllocateInfo alloc_info;
13120 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13121 alloc_info.pNext = NULL;
13122 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013123 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070013124 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
13125 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
13126
13127 VkCommandBufferBeginInfo cb_binfo;
13128 cb_binfo.pNext = NULL;
13129 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13130 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
13131 cb_binfo.flags = 0;
13132 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
13133 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13134 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
13135 vkEndCommandBuffer(cmd_bufs[0]);
13136 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
13137
13138 VkSubmitInfo submit_info = {};
13139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13140 submit_info.commandBufferCount = 2;
13141 submit_info.pCommandBuffers = duplicates;
13142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
13143 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13144 m_errorMonitor->VerifyFound();
13145 vkQueueWaitIdle(m_device->m_queue);
13146
13147 // Set one time use and now look for one time submit
13148 duplicates[0] = duplicates[1] = cmd_bufs[1];
13149 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
13150 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
13151 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
13152 vkEndCommandBuffer(cmd_bufs[1]);
13153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
13154 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13155 m_errorMonitor->VerifyFound();
13156 vkQueueWaitIdle(m_device->m_queue);
13157}
13158
Tobin Ehlisb093da82017-01-19 12:05:27 -070013159TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013160 TEST_DESCRIPTION(
13161 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
13162 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070013163
Tony Barbour1fa09702017-03-16 12:09:08 -060013164 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070013165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13166
13167 std::vector<const char *> device_extension_names;
13168 auto features = m_device->phy().features();
13169 // Make sure gs & ts are disabled
13170 features.geometryShader = false;
13171 features.tessellationShader = false;
13172 // The sacrificial device object
13173 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13174
13175 VkCommandPoolCreateInfo pool_create_info{};
13176 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
13177 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
13178
13179 VkCommandPool command_pool;
13180 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
13181
13182 VkCommandBufferAllocateInfo cmd = {};
13183 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13184 cmd.pNext = NULL;
13185 cmd.commandPool = command_pool;
13186 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
13187 cmd.commandBufferCount = 1;
13188
13189 VkCommandBuffer cmd_buffer;
13190 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
13191 ASSERT_VK_SUCCESS(err);
13192
13193 VkEvent event;
13194 VkEventCreateInfo evci = {};
13195 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13196 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
13197 ASSERT_VK_SUCCESS(result);
13198
13199 VkCommandBufferBeginInfo cbbi = {};
13200 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13201 vkBeginCommandBuffer(cmd_buffer, &cbbi);
13202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
13203 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
13204 m_errorMonitor->VerifyFound();
13205
13206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
13207 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
13208 m_errorMonitor->VerifyFound();
13209
13210 vkDestroyEvent(test_device.handle(), event, NULL);
13211 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
13212}
13213
Chris Forbesd70103a2017-04-13 11:34:09 -070013214TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060013215 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060013216 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13217
Tony Barbour552f6c02016-12-21 14:34:07 -070013218 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013219
13220 VkEvent event;
13221 VkEventCreateInfo event_create_info = {};
13222 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13223 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013224 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013225
Tony Barbour552f6c02016-12-21 14:34:07 -070013226 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013227 vkDestroyEvent(m_device->device(), event, nullptr);
13228
13229 VkSubmitInfo submit_info = {};
13230 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13231 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013232 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070013233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13235 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070013236}
Mark Muellerc8d441e2016-08-23 17:36:00 -060013237
Chris Forbesd70103a2017-04-13 11:34:09 -070013238TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13239 TEST_DESCRIPTION(
13240 "Use vkCmdExecuteCommands with invalid state "
13241 "in primary and secondary command buffers. "
13242 "Delete objects that are inuse. Call VkQueueSubmit "
13243 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013244
Chris Forbesd70103a2017-04-13 11:34:09 -070013245 ASSERT_NO_FATAL_FAILURE(Init());
13246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13247
13248 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013249
Mark Mueller917f6bc2016-08-30 10:57:19 -060013250 VkSemaphoreCreateInfo semaphore_create_info = {};
13251 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13252 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013253 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013254 VkFenceCreateInfo fence_create_info = {};
13255 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13256 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013257 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013258
13259 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013260 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013261 descriptor_pool_type_count.descriptorCount = 1;
13262
13263 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13264 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13265 descriptor_pool_create_info.maxSets = 1;
13266 descriptor_pool_create_info.poolSizeCount = 1;
13267 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013268 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013269
13270 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013271 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013272
13273 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013274 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013275 descriptorset_layout_binding.descriptorCount = 1;
13276 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13277
13278 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013279 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013280 descriptorset_layout_create_info.bindingCount = 1;
13281 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13282
13283 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013284 ASSERT_VK_SUCCESS(
13285 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013286
13287 VkDescriptorSet descriptorset;
13288 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013289 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013290 descriptorset_allocate_info.descriptorSetCount = 1;
13291 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13292 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013293 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013294
Mark Mueller4042b652016-09-05 22:52:21 -060013295 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13296
13297 VkDescriptorBufferInfo buffer_info = {};
13298 buffer_info.buffer = buffer_test.GetBuffer();
13299 buffer_info.offset = 0;
13300 buffer_info.range = 1024;
13301
13302 VkWriteDescriptorSet write_descriptor_set = {};
13303 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13304 write_descriptor_set.dstSet = descriptorset;
13305 write_descriptor_set.descriptorCount = 1;
13306 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13307 write_descriptor_set.pBufferInfo = &buffer_info;
13308
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013309 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013310
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013311 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13312 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013313
13314 VkPipelineObj pipe(m_device);
13315 pipe.AddColorAttachment();
13316 pipe.AddShader(&vs);
13317 pipe.AddShader(&fs);
13318
13319 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013320 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013321 pipeline_layout_create_info.setLayoutCount = 1;
13322 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13323
13324 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013325 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013326
13327 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13328
Chris Forbesd70103a2017-04-13 11:34:09 -070013329 VkEvent event;
13330 VkEventCreateInfo event_create_info = {};
13331 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13332 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13333
Tony Barbour552f6c02016-12-21 14:34:07 -070013334 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013336 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013338 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13339 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13340 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013341
Tony Barbour552f6c02016-12-21 14:34:07 -070013342 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013343
Chris Forbesd70103a2017-04-13 11:34:09 -070013344 VkSubmitInfo submit_info = {};
13345 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13346 submit_info.commandBufferCount = 1;
13347 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013348 submit_info.signalSemaphoreCount = 1;
13349 submit_info.pSignalSemaphores = &semaphore;
13350 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013351 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013352
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013354 vkDestroyEvent(m_device->device(), event, nullptr);
13355 m_errorMonitor->VerifyFound();
13356
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013358 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13359 m_errorMonitor->VerifyFound();
13360
Jeremy Hayes08369882017-02-02 10:31:06 -070013361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013362 vkDestroyFence(m_device->device(), fence, nullptr);
13363 m_errorMonitor->VerifyFound();
13364
Tobin Ehlis122207b2016-09-01 08:50:06 -070013365 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013366 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13367 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013368 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013369 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13370 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013371 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013372 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13373 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013374 vkDestroyEvent(m_device->device(), event, nullptr);
13375 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013376 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013377 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13378}
13379
Tobin Ehlis2adda372016-09-01 08:51:06 -070013380TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13381 TEST_DESCRIPTION("Delete in-use query pool.");
13382
Tony Barbour1fa09702017-03-16 12:09:08 -060013383 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13385
13386 VkQueryPool query_pool;
13387 VkQueryPoolCreateInfo query_pool_ci{};
13388 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13389 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13390 query_pool_ci.queryCount = 1;
13391 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013392 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013393 // Reset query pool to create binding with cmd buffer
13394 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13395
Tony Barbour552f6c02016-12-21 14:34:07 -070013396 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013397
13398 VkSubmitInfo submit_info = {};
13399 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13400 submit_info.commandBufferCount = 1;
13401 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13402 // Submit cmd buffer and then destroy query pool while in-flight
13403 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13404
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013406 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13407 m_errorMonitor->VerifyFound();
13408
13409 vkQueueWaitIdle(m_device->m_queue);
13410 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013411 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013412 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013413 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13414}
13415
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013416TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13417 TEST_DESCRIPTION("Delete in-use pipeline.");
13418
Tony Barbour1fa09702017-03-16 12:09:08 -060013419 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13421
13422 // Empty pipeline layout used for binding PSO
13423 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13424 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13425 pipeline_layout_ci.setLayoutCount = 0;
13426 pipeline_layout_ci.pSetLayouts = NULL;
13427
13428 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013429 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013430 ASSERT_VK_SUCCESS(err);
13431
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013433 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013434 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13435 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013436 // Store pipeline handle so we can actually delete it before test finishes
13437 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013438 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013439 VkPipelineObj pipe(m_device);
13440 pipe.AddShader(&vs);
13441 pipe.AddShader(&fs);
13442 pipe.AddColorAttachment();
13443 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13444 delete_this_pipeline = pipe.handle();
13445
Tony Barbour552f6c02016-12-21 14:34:07 -070013446 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013447 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013448 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013449
Tony Barbour552f6c02016-12-21 14:34:07 -070013450 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013451
13452 VkSubmitInfo submit_info = {};
13453 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13454 submit_info.commandBufferCount = 1;
13455 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13456 // Submit cmd buffer and then pipeline destroyed while in-flight
13457 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013458 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013459 m_errorMonitor->VerifyFound();
13460 // Make sure queue finished and then actually delete pipeline
13461 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013462 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13463 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013464 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13465 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13466}
13467
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013468TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13469 TEST_DESCRIPTION("Delete in-use imageView.");
13470
Tony Barbour1fa09702017-03-16 12:09:08 -060013471 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13473
13474 VkDescriptorPoolSize ds_type_count;
13475 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13476 ds_type_count.descriptorCount = 1;
13477
13478 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13479 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13480 ds_pool_ci.maxSets = 1;
13481 ds_pool_ci.poolSizeCount = 1;
13482 ds_pool_ci.pPoolSizes = &ds_type_count;
13483
13484 VkDescriptorPool ds_pool;
13485 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13486 ASSERT_VK_SUCCESS(err);
13487
13488 VkSamplerCreateInfo sampler_ci = {};
13489 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13490 sampler_ci.pNext = NULL;
13491 sampler_ci.magFilter = VK_FILTER_NEAREST;
13492 sampler_ci.minFilter = VK_FILTER_NEAREST;
13493 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13494 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13495 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13496 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13497 sampler_ci.mipLodBias = 1.0;
13498 sampler_ci.anisotropyEnable = VK_FALSE;
13499 sampler_ci.maxAnisotropy = 1;
13500 sampler_ci.compareEnable = VK_FALSE;
13501 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13502 sampler_ci.minLod = 1.0;
13503 sampler_ci.maxLod = 1.0;
13504 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13505 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13506 VkSampler sampler;
13507
13508 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13509 ASSERT_VK_SUCCESS(err);
13510
13511 VkDescriptorSetLayoutBinding layout_binding;
13512 layout_binding.binding = 0;
13513 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13514 layout_binding.descriptorCount = 1;
13515 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13516 layout_binding.pImmutableSamplers = NULL;
13517
13518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13520 ds_layout_ci.bindingCount = 1;
13521 ds_layout_ci.pBindings = &layout_binding;
13522 VkDescriptorSetLayout ds_layout;
13523 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13524 ASSERT_VK_SUCCESS(err);
13525
13526 VkDescriptorSetAllocateInfo alloc_info = {};
13527 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13528 alloc_info.descriptorSetCount = 1;
13529 alloc_info.descriptorPool = ds_pool;
13530 alloc_info.pSetLayouts = &ds_layout;
13531 VkDescriptorSet descriptor_set;
13532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13533 ASSERT_VK_SUCCESS(err);
13534
13535 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13536 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13537 pipeline_layout_ci.pNext = NULL;
13538 pipeline_layout_ci.setLayoutCount = 1;
13539 pipeline_layout_ci.pSetLayouts = &ds_layout;
13540
13541 VkPipelineLayout pipeline_layout;
13542 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13543 ASSERT_VK_SUCCESS(err);
13544
13545 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013546 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 -060013547 ASSERT_TRUE(image.initialized());
13548
13549 VkImageView view;
13550 VkImageViewCreateInfo ivci = {};
13551 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13552 ivci.image = image.handle();
13553 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13554 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13555 ivci.subresourceRange.layerCount = 1;
13556 ivci.subresourceRange.baseMipLevel = 0;
13557 ivci.subresourceRange.levelCount = 1;
13558 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13559
13560 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13561 ASSERT_VK_SUCCESS(err);
13562
13563 VkDescriptorImageInfo image_info{};
13564 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13565 image_info.imageView = view;
13566 image_info.sampler = sampler;
13567
13568 VkWriteDescriptorSet descriptor_write = {};
13569 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13570 descriptor_write.dstSet = descriptor_set;
13571 descriptor_write.dstBinding = 0;
13572 descriptor_write.descriptorCount = 1;
13573 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13574 descriptor_write.pImageInfo = &image_info;
13575
13576 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13577
13578 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013579 char const *vsSource =
13580 "#version 450\n"
13581 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013582 "void main(){\n"
13583 " gl_Position = vec4(1);\n"
13584 "}\n";
13585 char const *fsSource =
13586 "#version 450\n"
13587 "\n"
13588 "layout(set=0, binding=0) uniform sampler2D s;\n"
13589 "layout(location=0) out vec4 x;\n"
13590 "void main(){\n"
13591 " x = texture(s, vec2(1));\n"
13592 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013593 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13594 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13595 VkPipelineObj pipe(m_device);
13596 pipe.AddShader(&vs);
13597 pipe.AddShader(&fs);
13598 pipe.AddColorAttachment();
13599 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13600
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013602
Tony Barbour552f6c02016-12-21 14:34:07 -070013603 m_commandBuffer->BeginCommandBuffer();
13604 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013605 // Bind pipeline to cmd buffer
13606 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13607 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13608 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013609
13610 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13611 VkRect2D scissor = {{0, 0}, {16, 16}};
13612 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13613 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13614
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013615 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013616 m_commandBuffer->EndRenderPass();
13617 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013618 // Submit cmd buffer then destroy sampler
13619 VkSubmitInfo submit_info = {};
13620 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13621 submit_info.commandBufferCount = 1;
13622 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13623 // Submit cmd buffer and then destroy imageView while in-flight
13624 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13625
13626 vkDestroyImageView(m_device->device(), view, nullptr);
13627 m_errorMonitor->VerifyFound();
13628 vkQueueWaitIdle(m_device->m_queue);
13629 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013630 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013631 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013632 vkDestroyImageView(m_device->device(), view, NULL);
13633 vkDestroySampler(m_device->device(), sampler, nullptr);
13634 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13635 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13636 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13637}
13638
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013639TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13640 TEST_DESCRIPTION("Delete in-use bufferView.");
13641
Tony Barbour1fa09702017-03-16 12:09:08 -060013642 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013643 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13644
13645 VkDescriptorPoolSize ds_type_count;
13646 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13647 ds_type_count.descriptorCount = 1;
13648
13649 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13650 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13651 ds_pool_ci.maxSets = 1;
13652 ds_pool_ci.poolSizeCount = 1;
13653 ds_pool_ci.pPoolSizes = &ds_type_count;
13654
13655 VkDescriptorPool ds_pool;
13656 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13657 ASSERT_VK_SUCCESS(err);
13658
13659 VkDescriptorSetLayoutBinding layout_binding;
13660 layout_binding.binding = 0;
13661 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13662 layout_binding.descriptorCount = 1;
13663 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13664 layout_binding.pImmutableSamplers = NULL;
13665
13666 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13667 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13668 ds_layout_ci.bindingCount = 1;
13669 ds_layout_ci.pBindings = &layout_binding;
13670 VkDescriptorSetLayout ds_layout;
13671 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13672 ASSERT_VK_SUCCESS(err);
13673
13674 VkDescriptorSetAllocateInfo alloc_info = {};
13675 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13676 alloc_info.descriptorSetCount = 1;
13677 alloc_info.descriptorPool = ds_pool;
13678 alloc_info.pSetLayouts = &ds_layout;
13679 VkDescriptorSet descriptor_set;
13680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13681 ASSERT_VK_SUCCESS(err);
13682
13683 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13684 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13685 pipeline_layout_ci.pNext = NULL;
13686 pipeline_layout_ci.setLayoutCount = 1;
13687 pipeline_layout_ci.pSetLayouts = &ds_layout;
13688
13689 VkPipelineLayout pipeline_layout;
13690 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13691 ASSERT_VK_SUCCESS(err);
13692
13693 VkBuffer buffer;
13694 uint32_t queue_family_index = 0;
13695 VkBufferCreateInfo buffer_create_info = {};
13696 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13697 buffer_create_info.size = 1024;
13698 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13699 buffer_create_info.queueFamilyIndexCount = 1;
13700 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13701
13702 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13703 ASSERT_VK_SUCCESS(err);
13704
13705 VkMemoryRequirements memory_reqs;
13706 VkDeviceMemory buffer_memory;
13707
13708 VkMemoryAllocateInfo memory_info = {};
13709 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13710 memory_info.allocationSize = 0;
13711 memory_info.memoryTypeIndex = 0;
13712
13713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13714 memory_info.allocationSize = memory_reqs.size;
13715 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13716 ASSERT_TRUE(pass);
13717
13718 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13719 ASSERT_VK_SUCCESS(err);
13720 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13721 ASSERT_VK_SUCCESS(err);
13722
13723 VkBufferView view;
13724 VkBufferViewCreateInfo bvci = {};
13725 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13726 bvci.buffer = buffer;
Tobin Ehliscc980e12017-05-19 12:05:49 -060013727 bvci.format = VK_FORMAT_R32_SFLOAT;
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013728 bvci.range = VK_WHOLE_SIZE;
13729
13730 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13731 ASSERT_VK_SUCCESS(err);
13732
13733 VkWriteDescriptorSet descriptor_write = {};
13734 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13735 descriptor_write.dstSet = descriptor_set;
13736 descriptor_write.dstBinding = 0;
13737 descriptor_write.descriptorCount = 1;
13738 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13739 descriptor_write.pTexelBufferView = &view;
13740
13741 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013743 char const *vsSource =
13744 "#version 450\n"
13745 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013746 "void main(){\n"
13747 " gl_Position = vec4(1);\n"
13748 "}\n";
13749 char const *fsSource =
13750 "#version 450\n"
13751 "\n"
Tobin Ehliscc980e12017-05-19 12:05:49 -060013752 "layout(set=0, binding=0, r32f) uniform imageBuffer s;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013753 "layout(location=0) out vec4 x;\n"
13754 "void main(){\n"
13755 " x = imageLoad(s, 0);\n"
13756 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013757 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13758 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13759 VkPipelineObj pipe(m_device);
13760 pipe.AddShader(&vs);
13761 pipe.AddShader(&fs);
13762 pipe.AddColorAttachment();
13763 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13764
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013766
Tony Barbour552f6c02016-12-21 14:34:07 -070013767 m_commandBuffer->BeginCommandBuffer();
13768 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013769 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13770 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13771 VkRect2D scissor = {{0, 0}, {16, 16}};
13772 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13773 // Bind pipeline to cmd buffer
13774 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13775 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13776 &descriptor_set, 0, nullptr);
13777 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013778 m_commandBuffer->EndRenderPass();
13779 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013780
13781 VkSubmitInfo submit_info = {};
13782 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13783 submit_info.commandBufferCount = 1;
13784 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13785 // Submit cmd buffer and then destroy bufferView while in-flight
13786 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13787
13788 vkDestroyBufferView(m_device->device(), view, nullptr);
13789 m_errorMonitor->VerifyFound();
13790 vkQueueWaitIdle(m_device->m_queue);
13791 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013792 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013793 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013794 vkDestroyBufferView(m_device->device(), view, NULL);
13795 vkDestroyBuffer(m_device->device(), buffer, NULL);
13796 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13797 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13798 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13799 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13800}
13801
Tobin Ehlis209532e2016-09-07 13:52:18 -060013802TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13803 TEST_DESCRIPTION("Delete in-use sampler.");
13804
Tony Barbour1fa09702017-03-16 12:09:08 -060013805 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13807
13808 VkDescriptorPoolSize ds_type_count;
13809 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13810 ds_type_count.descriptorCount = 1;
13811
13812 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13813 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13814 ds_pool_ci.maxSets = 1;
13815 ds_pool_ci.poolSizeCount = 1;
13816 ds_pool_ci.pPoolSizes = &ds_type_count;
13817
13818 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013819 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013820 ASSERT_VK_SUCCESS(err);
13821
13822 VkSamplerCreateInfo sampler_ci = {};
13823 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13824 sampler_ci.pNext = NULL;
13825 sampler_ci.magFilter = VK_FILTER_NEAREST;
13826 sampler_ci.minFilter = VK_FILTER_NEAREST;
13827 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13828 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13829 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13830 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13831 sampler_ci.mipLodBias = 1.0;
13832 sampler_ci.anisotropyEnable = VK_FALSE;
13833 sampler_ci.maxAnisotropy = 1;
13834 sampler_ci.compareEnable = VK_FALSE;
13835 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13836 sampler_ci.minLod = 1.0;
13837 sampler_ci.maxLod = 1.0;
13838 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13839 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13840 VkSampler sampler;
13841
13842 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13843 ASSERT_VK_SUCCESS(err);
13844
13845 VkDescriptorSetLayoutBinding layout_binding;
13846 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013847 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013848 layout_binding.descriptorCount = 1;
13849 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13850 layout_binding.pImmutableSamplers = NULL;
13851
13852 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13853 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13854 ds_layout_ci.bindingCount = 1;
13855 ds_layout_ci.pBindings = &layout_binding;
13856 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013857 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013858 ASSERT_VK_SUCCESS(err);
13859
13860 VkDescriptorSetAllocateInfo alloc_info = {};
13861 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13862 alloc_info.descriptorSetCount = 1;
13863 alloc_info.descriptorPool = ds_pool;
13864 alloc_info.pSetLayouts = &ds_layout;
13865 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013866 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013867 ASSERT_VK_SUCCESS(err);
13868
13869 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13870 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13871 pipeline_layout_ci.pNext = NULL;
13872 pipeline_layout_ci.setLayoutCount = 1;
13873 pipeline_layout_ci.pSetLayouts = &ds_layout;
13874
13875 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013876 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013877 ASSERT_VK_SUCCESS(err);
13878
13879 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013880 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 -060013881 ASSERT_TRUE(image.initialized());
13882
13883 VkImageView view;
13884 VkImageViewCreateInfo ivci = {};
13885 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13886 ivci.image = image.handle();
13887 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13888 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13889 ivci.subresourceRange.layerCount = 1;
13890 ivci.subresourceRange.baseMipLevel = 0;
13891 ivci.subresourceRange.levelCount = 1;
13892 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13893
13894 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13895 ASSERT_VK_SUCCESS(err);
13896
13897 VkDescriptorImageInfo image_info{};
13898 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13899 image_info.imageView = view;
13900 image_info.sampler = sampler;
13901
13902 VkWriteDescriptorSet descriptor_write = {};
13903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13904 descriptor_write.dstSet = descriptor_set;
13905 descriptor_write.dstBinding = 0;
13906 descriptor_write.descriptorCount = 1;
13907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13908 descriptor_write.pImageInfo = &image_info;
13909
13910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13911
13912 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013913 char const *vsSource =
13914 "#version 450\n"
13915 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013916 "void main(){\n"
13917 " gl_Position = vec4(1);\n"
13918 "}\n";
13919 char const *fsSource =
13920 "#version 450\n"
13921 "\n"
13922 "layout(set=0, binding=0) uniform sampler2D s;\n"
13923 "layout(location=0) out vec4 x;\n"
13924 "void main(){\n"
13925 " x = texture(s, vec2(1));\n"
13926 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13929 VkPipelineObj pipe(m_device);
13930 pipe.AddShader(&vs);
13931 pipe.AddShader(&fs);
13932 pipe.AddColorAttachment();
13933 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13934
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013936
Tony Barbour552f6c02016-12-21 14:34:07 -070013937 m_commandBuffer->BeginCommandBuffer();
13938 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013939 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013940 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13941 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13942 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013943
13944 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13945 VkRect2D scissor = {{0, 0}, {16, 16}};
13946 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13947 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13948
Tobin Ehlis209532e2016-09-07 13:52:18 -060013949 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013950 m_commandBuffer->EndRenderPass();
13951 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013952 // Submit cmd buffer then destroy sampler
13953 VkSubmitInfo submit_info = {};
13954 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13955 submit_info.commandBufferCount = 1;
13956 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13957 // Submit cmd buffer and then destroy sampler while in-flight
13958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13959
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013960 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013961 m_errorMonitor->VerifyFound();
13962 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013963
Tobin Ehlis209532e2016-09-07 13:52:18 -060013964 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013965 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13966 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013967 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013968 vkDestroyImageView(m_device->device(), view, NULL);
13969 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13970 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13972}
13973
Mark Mueller1cd9f412016-08-25 13:23:52 -060013974TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013975 TEST_DESCRIPTION(
13976 "Call VkQueueSubmit with a semaphore that is already "
13977 "signaled but not waited on by the queue. Wait on a "
13978 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013979
Tony Barbour1fa09702017-03-16 12:09:08 -060013980 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13982
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013983 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 -070013984 const char *invalid_fence_wait_message =
13985 " which has not been submitted on a Queue or during "
13986 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013987
Chris Forbese98aec12017-05-18 12:50:14 -070013988 VkCommandBufferObj cb1(m_device, m_commandPool);
13989 cb1.begin();
13990 cb1.end();
Mark Mueller96a56d52016-08-24 10:28:05 -060013991
13992 VkSemaphoreCreateInfo semaphore_create_info = {};
13993 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13994 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013995 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013996 VkSubmitInfo submit_info = {};
13997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13998 submit_info.commandBufferCount = 1;
Chris Forbese98aec12017-05-18 12:50:14 -070013999 submit_info.pCommandBuffers = &cb1.handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060014000 submit_info.signalSemaphoreCount = 1;
14001 submit_info.pSignalSemaphores = &semaphore;
14002 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Chris Forbese98aec12017-05-18 12:50:14 -070014003
Tony Barbour552f6c02016-12-21 14:34:07 -070014004 m_commandBuffer->BeginCommandBuffer();
14005 m_commandBuffer->EndCommandBuffer();
Chris Forbese98aec12017-05-18 12:50:14 -070014006 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060014008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14009 m_errorMonitor->VerifyFound();
14010
Mark Mueller1cd9f412016-08-25 13:23:52 -060014011 VkFenceCreateInfo fence_create_info = {};
14012 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
14013 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014014 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060014015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060014017 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
14018 m_errorMonitor->VerifyFound();
14019
Mark Mueller4042b652016-09-05 22:52:21 -060014020 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060014021 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060014022 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
14023}
14024
Tobin Ehlis4af23302016-07-19 10:50:30 -060014025TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014026 TEST_DESCRIPTION(
14027 "Bind a secondary command buffer with with a framebuffer "
14028 "that does not match the framebuffer for the active "
14029 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060014030 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060014031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14032
14033 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014034 VkAttachmentDescription attachment = {0,
14035 VK_FORMAT_B8G8R8A8_UNORM,
14036 VK_SAMPLE_COUNT_1_BIT,
14037 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
14038 VK_ATTACHMENT_STORE_OP_STORE,
14039 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
14040 VK_ATTACHMENT_STORE_OP_DONT_CARE,
14041 VK_IMAGE_LAYOUT_UNDEFINED,
14042 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014044 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014045
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014046 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014048 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014049
14050 VkRenderPass rp;
14051 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14052 ASSERT_VK_SUCCESS(err);
14053
14054 // A compatible framebuffer.
14055 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060014056 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 -060014057 ASSERT_TRUE(image.initialized());
14058
14059 VkImageViewCreateInfo ivci = {
14060 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
14061 nullptr,
14062 0,
14063 image.handle(),
14064 VK_IMAGE_VIEW_TYPE_2D,
14065 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014066 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
14067 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060014068 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
14069 };
14070 VkImageView view;
14071 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
14072 ASSERT_VK_SUCCESS(err);
14073
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014074 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014075 VkFramebuffer fb;
14076 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
14077 ASSERT_VK_SUCCESS(err);
14078
14079 VkCommandBufferAllocateInfo cbai = {};
14080 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070014081 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060014082 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
14083 cbai.commandBufferCount = 1;
14084
14085 VkCommandBuffer sec_cb;
14086 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
14087 ASSERT_VK_SUCCESS(err);
14088 VkCommandBufferBeginInfo cbbi = {};
14089 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130014090 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060014091 cbii.renderPass = renderPass();
14092 cbii.framebuffer = fb;
14093 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
14094 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014095 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 -060014096 cbbi.pInheritanceInfo = &cbii;
14097 vkBeginCommandBuffer(sec_cb, &cbbi);
14098 vkEndCommandBuffer(sec_cb);
14099
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014100 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120014101 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
14102 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060014103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014105 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060014106 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
14107 m_errorMonitor->VerifyFound();
14108 // Cleanup
14109 vkDestroyImageView(m_device->device(), view, NULL);
14110 vkDestroyRenderPass(m_device->device(), rp, NULL);
14111 vkDestroyFramebuffer(m_device->device(), fb, NULL);
14112}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014113
14114TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014115 TEST_DESCRIPTION(
14116 "If logicOp is available on the device, set it to an "
14117 "invalid value. If logicOp is not available, attempt to "
14118 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060014119 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14121
14122 auto features = m_device->phy().features();
14123 // Set the expected error depending on whether or not logicOp available
14124 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14126 "If logic operations feature not "
14127 "enabled, logicOpEnable must be "
14128 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014129 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130014130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014131 }
14132 // Create a pipeline using logicOp
14133 VkResult err;
14134
14135 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
14136 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14137
14138 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014140 ASSERT_VK_SUCCESS(err);
14141
14142 VkPipelineViewportStateCreateInfo vp_state_ci = {};
14143 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14144 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014145 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014146 vp_state_ci.pViewports = &vp;
14147 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014148 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014149 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014150
14151 VkPipelineShaderStageCreateInfo shaderStages[2];
14152 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
14153
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014154 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
14155 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014156 shaderStages[0] = vs.GetStageCreateInfo();
14157 shaderStages[1] = fs.GetStageCreateInfo();
14158
14159 VkPipelineVertexInputStateCreateInfo vi_ci = {};
14160 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14161
14162 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
14163 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14164 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14165
14166 VkPipelineRasterizationStateCreateInfo rs_ci = {};
14167 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130014168 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014169
14170 VkPipelineColorBlendAttachmentState att = {};
14171 att.blendEnable = VK_FALSE;
14172 att.colorWriteMask = 0xf;
14173
14174 VkPipelineColorBlendStateCreateInfo cb_ci = {};
14175 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14176 // Enable logicOp & set logicOp to value 1 beyond allowed entries
14177 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014178 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014179 cb_ci.attachmentCount = 1;
14180 cb_ci.pAttachments = &att;
14181
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014182 VkPipelineMultisampleStateCreateInfo ms_ci = {};
14183 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
14184 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
14185
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014186 VkGraphicsPipelineCreateInfo gp_ci = {};
14187 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14188 gp_ci.stageCount = 2;
14189 gp_ci.pStages = shaderStages;
14190 gp_ci.pVertexInputState = &vi_ci;
14191 gp_ci.pInputAssemblyState = &ia_ci;
14192 gp_ci.pViewportState = &vp_state_ci;
14193 gp_ci.pRasterizationState = &rs_ci;
14194 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014195 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014196 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14197 gp_ci.layout = pipeline_layout;
14198 gp_ci.renderPass = renderPass();
14199
14200 VkPipelineCacheCreateInfo pc_ci = {};
14201 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14202
14203 VkPipeline pipeline;
14204 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014205 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014206 ASSERT_VK_SUCCESS(err);
14207
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014208 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014209 m_errorMonitor->VerifyFound();
14210 if (VK_SUCCESS == err) {
14211 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14212 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014213 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14214 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14215}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014216
Mike Stroyanaccf7692015-05-12 16:00:45 -060014217#if GTEST_IS_THREADSAFE
14218struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014219 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060014220 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014221 VkEvent event;
14222 bool bailout;
14223};
14224
Karl Schultz6addd812016-02-02 17:17:23 -070014225extern "C" void *AddToCommandBuffer(void *arg) {
14226 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014227
Mike Stroyana6d14942016-07-13 15:10:05 -060014228 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014229 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014230 if (data->bailout) {
14231 break;
14232 }
14233 }
14234 return NULL;
14235}
14236
Karl Schultz6addd812016-02-02 17:17:23 -070014237TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014238 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014239
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014241
Tony Barbour1fa09702017-03-16 12:09:08 -060014242 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014243 ASSERT_NO_FATAL_FAILURE(InitViewport());
14244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14245
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014246 // Calls AllocateCommandBuffers
14247 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014248
14249 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014250 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014251
14252 VkEventCreateInfo event_info;
14253 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014254 VkResult err;
14255
14256 memset(&event_info, 0, sizeof(event_info));
14257 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14258
Chia-I Wuf7458c52015-10-26 21:10:41 +080014259 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014260 ASSERT_VK_SUCCESS(err);
14261
Mike Stroyanaccf7692015-05-12 16:00:45 -060014262 err = vkResetEvent(device(), event);
14263 ASSERT_VK_SUCCESS(err);
14264
14265 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014266 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014267 data.event = event;
14268 data.bailout = false;
14269 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014270
14271 // First do some correct operations using multiple threads.
14272 // Add many entries to command buffer from another thread.
14273 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14274 // Make non-conflicting calls from this thread at the same time.
14275 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014276 uint32_t count;
14277 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014278 }
14279 test_platform_thread_join(thread, NULL);
14280
14281 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014282 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014283 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014284 // Add many entries to command buffer from this thread at the same time.
14285 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014286
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014287 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014288 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014289
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014290 m_errorMonitor->SetBailout(NULL);
14291
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014292 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014293
Chia-I Wuf7458c52015-10-26 21:10:41 +080014294 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014295}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014296#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014297
Karl Schultz6addd812016-02-02 17:17:23 -070014298TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014299 TEST_DESCRIPTION("Test that errors are produced for a spirv modules with invalid code sizes");
Chris Forbes1cc79542016-07-20 11:13:44 +120014300
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014302
Tony Barbour1fa09702017-03-16 12:09:08 -060014303 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14305
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014306 VkShaderModule module;
14307 VkShaderModuleCreateInfo moduleCreateInfo;
14308 struct icd_spv_header spv;
14309
14310 spv.magic = ICD_SPV_MAGIC;
14311 spv.version = ICD_SPV_VERSION;
14312 spv.gen_magic = 0;
14313
14314 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14315 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014316 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014317 moduleCreateInfo.codeSize = 4;
14318 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014319 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014320
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014321 m_errorMonitor->VerifyFound();
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014322
14323 char const *vsSource =
14324 "#version 450\n"
14325 "\n"
14326 "layout(location=0) out float x;\n"
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014327 "void main(){\n"
14328 " gl_Position = vec4(1);\n"
14329 " x = 0;\n"
14330 "}\n";
14331
14332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02816);
14333 std::vector<unsigned int> shader;
14334 VkShaderModuleCreateInfo module_create_info;
14335 VkShaderModule shader_module;
14336 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14337 module_create_info.pNext = NULL;
14338 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, shader);
14339 module_create_info.pCode = shader.data();
14340 // Introduce failure by making codeSize a non-multiple of 4
14341 module_create_info.codeSize = shader.size() * sizeof(unsigned int) - 1;
14342 module_create_info.flags = 0;
14343 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
14344
14345 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014346}
14347
Karl Schultz6addd812016-02-02 17:17:23 -070014348TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014349 TEST_DESCRIPTION(
14350 "Test that an error is produced for a spirv module "
14351 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014354
Tony Barbour1fa09702017-03-16 12:09:08 -060014355 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14357
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014358 VkShaderModule module;
14359 VkShaderModuleCreateInfo moduleCreateInfo;
14360 struct icd_spv_header spv;
14361
14362 spv.magic = ~ICD_SPV_MAGIC;
14363 spv.version = ICD_SPV_VERSION;
14364 spv.gen_magic = 0;
14365
14366 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14367 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014368 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014369 moduleCreateInfo.codeSize = sizeof(spv) + 16;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014370 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014371 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014372
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014373 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014374}
14375
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014376#if 0
14377// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014378TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014380 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014381
Tony Barbour1fa09702017-03-16 12:09:08 -060014382 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14384
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014385 VkShaderModule module;
14386 VkShaderModuleCreateInfo moduleCreateInfo;
14387 struct icd_spv_header spv;
14388
14389 spv.magic = ICD_SPV_MAGIC;
14390 spv.version = ~ICD_SPV_VERSION;
14391 spv.gen_magic = 0;
14392
14393 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14394 moduleCreateInfo.pNext = NULL;
14395
Karl Schultz6addd812016-02-02 17:17:23 -070014396 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014397 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14398 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014399 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014400
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014401 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014402}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014403#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014404
Karl Schultz6addd812016-02-02 17:17:23 -070014405TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014406 TEST_DESCRIPTION(
14407 "Test that a warning is produced for a vertex output that "
14408 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014410
Tony Barbour1fa09702017-03-16 12:09:08 -060014411 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014412 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014413
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014414 char const *vsSource =
14415 "#version 450\n"
14416 "\n"
14417 "layout(location=0) out float x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014418 "void main(){\n"
14419 " gl_Position = vec4(1);\n"
14420 " x = 0;\n"
14421 "}\n";
14422 char const *fsSource =
14423 "#version 450\n"
14424 "\n"
14425 "layout(location=0) out vec4 color;\n"
14426 "void main(){\n"
14427 " color = vec4(1);\n"
14428 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014429
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014430 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14431 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014432
14433 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014434 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014435 pipe.AddShader(&vs);
14436 pipe.AddShader(&fs);
14437
Chris Forbes9f7ff632015-05-25 11:13:08 +120014438 VkDescriptorSetObj descriptorSet(m_device);
14439 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014440 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014441
Tony Barbour5781e8f2015-08-04 16:23:11 -060014442 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014443
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014444 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014445}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014446
Mark Mueller098c9cb2016-09-08 09:01:57 -060014447TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14448 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14449
Tony Barbour1fa09702017-03-16 12:09:08 -060014450 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14452
14453 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014454 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014455
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014456 char const *vsSource =
14457 "#version 450\n"
14458 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014459 "void main(){\n"
14460 " gl_Position = vec4(1);\n"
14461 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014462
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014463 char const *fsSource =
14464 "#version 450\n"
14465 "\n"
14466 "layout (constant_id = 0) const float r = 0.0f;\n"
14467 "layout(location = 0) out vec4 uFragColor;\n"
14468 "void main(){\n"
14469 " uFragColor = vec4(r,1,0,1);\n"
14470 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014471
14472 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14473 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14474
14475 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14476 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14477
14478 VkPipelineLayout pipeline_layout;
14479 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14480
14481 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14482 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14483 vp_state_create_info.viewportCount = 1;
14484 VkViewport viewport = {};
14485 vp_state_create_info.pViewports = &viewport;
14486 vp_state_create_info.scissorCount = 1;
14487 VkRect2D scissors = {};
14488 vp_state_create_info.pScissors = &scissors;
14489
14490 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14491
14492 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14493 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14494 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14495 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14496
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014497 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014498
14499 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14500 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14501
14502 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14503 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14504 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14505
14506 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14507 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14508 rasterization_state_create_info.pNext = nullptr;
14509 rasterization_state_create_info.lineWidth = 1.0f;
14510 rasterization_state_create_info.rasterizerDiscardEnable = true;
14511
14512 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14513 color_blend_attachment_state.blendEnable = VK_FALSE;
14514 color_blend_attachment_state.colorWriteMask = 0xf;
14515
14516 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14517 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14518 color_blend_state_create_info.attachmentCount = 1;
14519 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14520
14521 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14522 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14523 graphicspipe_create_info.stageCount = 2;
14524 graphicspipe_create_info.pStages = shader_stage_create_info;
14525 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14526 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14527 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14528 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14529 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14530 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14531 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14532 graphicspipe_create_info.layout = pipeline_layout;
14533 graphicspipe_create_info.renderPass = renderPass();
14534
14535 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14536 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14537
14538 VkPipelineCache pipelineCache;
14539 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14540
14541 // This structure maps constant ids to data locations.
14542 const VkSpecializationMapEntry entry =
14543 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014544 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014545
14546 uint32_t data = 1;
14547
14548 // Set up the info describing spec map and data
14549 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014550 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014551 };
14552 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14553
14554 VkPipeline pipeline;
14555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14556 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14557 m_errorMonitor->VerifyFound();
14558
14559 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14560 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14561}
14562
14563TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14564 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14565
Tony Barbour1fa09702017-03-16 12:09:08 -060014566 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14568
14569 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14570
14571 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14572 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14573 descriptor_pool_type_count[0].descriptorCount = 1;
14574 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14575 descriptor_pool_type_count[1].descriptorCount = 1;
14576
14577 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14578 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14579 descriptor_pool_create_info.maxSets = 1;
14580 descriptor_pool_create_info.poolSizeCount = 2;
14581 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14582 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14583
14584 VkDescriptorPool descriptorset_pool;
14585 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14586
14587 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14588 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14589 descriptorset_layout_binding.descriptorCount = 1;
14590 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014591 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014592
14593 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14594 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14595 descriptorset_layout_create_info.bindingCount = 1;
14596 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14597
14598 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014599 ASSERT_VK_SUCCESS(
14600 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014601
14602 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14603 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14604 descriptorset_allocate_info.descriptorSetCount = 1;
14605 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14606 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14607 VkDescriptorSet descriptorset;
14608 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14609
14610 // Challenge core_validation with a non uniform buffer type.
14611 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14612
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014613 char const *vsSource =
14614 "#version 450\n"
14615 "\n"
14616 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14617 " mat4 mvp;\n"
14618 "} ubuf;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014619 "void main(){\n"
14620 " gl_Position = ubuf.mvp * vec4(1);\n"
14621 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014622
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014623 char const *fsSource =
14624 "#version 450\n"
14625 "\n"
14626 "layout(location = 0) out vec4 uFragColor;\n"
14627 "void main(){\n"
14628 " uFragColor = vec4(0,1,0,1);\n"
14629 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014630
14631 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14632 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14633
14634 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14635 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14636 pipeline_layout_create_info.setLayoutCount = 1;
14637 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14638
14639 VkPipelineLayout pipeline_layout;
14640 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14641
14642 VkPipelineObj pipe(m_device);
14643 pipe.AddColorAttachment();
14644 pipe.AddShader(&vs);
14645 pipe.AddShader(&fs);
14646
14647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14648 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14649 m_errorMonitor->VerifyFound();
14650
14651 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14652 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14653 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14654}
14655
14656TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14657 TEST_DESCRIPTION(
14658 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14659
Tony Barbour1fa09702017-03-16 12:09:08 -060014660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014661 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14662
14663 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14664
14665 VkDescriptorPoolSize descriptor_pool_type_count = {};
14666 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14667 descriptor_pool_type_count.descriptorCount = 1;
14668
14669 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14670 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14671 descriptor_pool_create_info.maxSets = 1;
14672 descriptor_pool_create_info.poolSizeCount = 1;
14673 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14674 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14675
14676 VkDescriptorPool descriptorset_pool;
14677 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14678
14679 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14680 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14681 descriptorset_layout_binding.descriptorCount = 1;
14682 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14683 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014684 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014685
14686 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14687 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14688 descriptorset_layout_create_info.bindingCount = 1;
14689 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14690
14691 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014692 ASSERT_VK_SUCCESS(
14693 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014694
14695 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14696 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14697 descriptorset_allocate_info.descriptorSetCount = 1;
14698 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14699 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14700 VkDescriptorSet descriptorset;
14701 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14702
14703 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14704
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014705 char const *vsSource =
14706 "#version 450\n"
14707 "\n"
14708 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14709 " mat4 mvp;\n"
14710 "} ubuf;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014711 "void main(){\n"
14712 " gl_Position = ubuf.mvp * vec4(1);\n"
14713 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014714
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014715 char const *fsSource =
14716 "#version 450\n"
14717 "\n"
14718 "layout(location = 0) out vec4 uFragColor;\n"
14719 "void main(){\n"
14720 " uFragColor = vec4(0,1,0,1);\n"
14721 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014722
14723 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14724 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14725
14726 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14727 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14728 pipeline_layout_create_info.setLayoutCount = 1;
14729 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14730
14731 VkPipelineLayout pipeline_layout;
14732 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14733
14734 VkPipelineObj pipe(m_device);
14735 pipe.AddColorAttachment();
14736 pipe.AddShader(&vs);
14737 pipe.AddShader(&fs);
14738
14739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14740 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14741 m_errorMonitor->VerifyFound();
14742
14743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14744 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14745 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14746}
14747
14748TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014749 TEST_DESCRIPTION(
14750 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14751 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014752
Tony Barbour1fa09702017-03-16 12:09:08 -060014753 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14755
14756 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014757 "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 -060014758
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014759 char const *vsSource =
14760 "#version 450\n"
14761 "\n"
14762 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014763 "void main(){\n"
14764 " gl_Position = vec4(consts.x);\n"
14765 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014766
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014767 char const *fsSource =
14768 "#version 450\n"
14769 "\n"
14770 "layout(location = 0) out vec4 uFragColor;\n"
14771 "void main(){\n"
14772 " uFragColor = vec4(0,1,0,1);\n"
14773 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014774
14775 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14776 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14777
14778 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14779 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14780
14781 // Set up a push constant range
14782 VkPushConstantRange push_constant_ranges = {};
14783 // Set to the wrong stage to challenge core_validation
14784 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14785 push_constant_ranges.size = 4;
14786
14787 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14788 pipeline_layout_create_info.pushConstantRangeCount = 1;
14789
14790 VkPipelineLayout pipeline_layout;
14791 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14792
14793 VkPipelineObj pipe(m_device);
14794 pipe.AddColorAttachment();
14795 pipe.AddShader(&vs);
14796 pipe.AddShader(&fs);
14797
14798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14799 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14800 m_errorMonitor->VerifyFound();
14801
14802 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14803}
14804
14805TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14806 TEST_DESCRIPTION(
14807 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14808
Tony Barbour1fa09702017-03-16 12:09:08 -060014809 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14811
14812 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014813 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014814
14815 // Some awkward steps are required to test with custom device features.
14816 std::vector<const char *> device_extension_names;
14817 auto features = m_device->phy().features();
14818 // Disable support for 64 bit floats
14819 features.shaderFloat64 = false;
14820 // The sacrificial device object
14821 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14822
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014823 char const *vsSource =
14824 "#version 450\n"
14825 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014826 "void main(){\n"
14827 " gl_Position = vec4(1);\n"
14828 "}\n";
14829 char const *fsSource =
14830 "#version 450\n"
14831 "\n"
14832 "layout(location=0) out vec4 color;\n"
14833 "void main(){\n"
14834 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14835 " color = vec4(green);\n"
14836 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014837
14838 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14839 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14840
14841 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014842
14843 VkPipelineObj pipe(&test_device);
14844 pipe.AddColorAttachment();
14845 pipe.AddShader(&vs);
14846 pipe.AddShader(&fs);
14847
14848 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14849 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14850 VkPipelineLayout pipeline_layout;
14851 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14852
14853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14854 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14855 m_errorMonitor->VerifyFound();
14856
14857 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14858}
14859
Mark Lobodzinski20832822017-03-24 14:49:45 -060014860TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14861 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14862 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014863
Tony Barbour1fa09702017-03-16 12:09:08 -060014864 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014867 char const *vsSource =
14868 "#version 450\n"
14869 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014870 "layout(xfb_buffer = 1) out;"
14871 "void main(){\n"
14872 " gl_Position = vec4(1);\n"
14873 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014874
Mark Lobodzinski20832822017-03-24 14:49:45 -060014875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014876
Mark Lobodzinski20832822017-03-24 14:49:45 -060014877 std::vector<unsigned int> spv;
14878 VkShaderModuleCreateInfo module_create_info;
14879 VkShaderModule shader_module;
14880 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14881 module_create_info.pNext = NULL;
14882 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14883 module_create_info.pCode = spv.data();
14884 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14885 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014886
Mark Lobodzinski20832822017-03-24 14:49:45 -060014887 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014888
Mark Lobodzinski20832822017-03-24 14:49:45 -060014889 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014890}
14891
Karl Schultz6addd812016-02-02 17:17:23 -070014892TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014893 TEST_DESCRIPTION(
14894 "Test that an error is produced for a fragment shader input "
14895 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014896
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014898
Tony Barbour1fa09702017-03-16 12:09:08 -060014899 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014901
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014902 char const *vsSource =
14903 "#version 450\n"
14904 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014905 "void main(){\n"
14906 " gl_Position = vec4(1);\n"
14907 "}\n";
14908 char const *fsSource =
14909 "#version 450\n"
14910 "\n"
14911 "layout(location=0) in float x;\n"
14912 "layout(location=0) out vec4 color;\n"
14913 "void main(){\n"
14914 " color = vec4(x);\n"
14915 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014916
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014917 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14918 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014919
14920 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014921 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014922 pipe.AddShader(&vs);
14923 pipe.AddShader(&fs);
14924
Chris Forbes59cb88d2015-05-25 11:13:13 +120014925 VkDescriptorSetObj descriptorSet(m_device);
14926 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014927 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014928
Tony Barbour5781e8f2015-08-04 16:23:11 -060014929 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014930
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014931 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014932}
14933
Karl Schultz6addd812016-02-02 17:17:23 -070014934TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014935 TEST_DESCRIPTION(
14936 "Test that an error is produced for a fragment shader input "
14937 "within an interace block, which is not present in the outputs "
14938 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014940
Tony Barbour1fa09702017-03-16 12:09:08 -060014941 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14943
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014944 char const *vsSource =
14945 "#version 450\n"
14946 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014947 "void main(){\n"
14948 " gl_Position = vec4(1);\n"
14949 "}\n";
14950 char const *fsSource =
14951 "#version 450\n"
14952 "\n"
14953 "in block { layout(location=0) float x; } ins;\n"
14954 "layout(location=0) out vec4 color;\n"
14955 "void main(){\n"
14956 " color = vec4(ins.x);\n"
14957 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014958
14959 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14960 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14961
14962 VkPipelineObj pipe(m_device);
14963 pipe.AddColorAttachment();
14964 pipe.AddShader(&vs);
14965 pipe.AddShader(&fs);
14966
14967 VkDescriptorSetObj descriptorSet(m_device);
14968 descriptorSet.AppendDummy();
14969 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14970
14971 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14972
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014973 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014974}
14975
Karl Schultz6addd812016-02-02 17:17:23 -070014976TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014977 TEST_DESCRIPTION(
14978 "Test that an error is produced for mismatched array sizes "
14979 "across the vertex->fragment shader interface");
14980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14981 "Type mismatch on location 0.0: 'ptr to "
14982 "output arr[2] of float32' vs 'ptr to "
14983 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014984
Tony Barbour1fa09702017-03-16 12:09:08 -060014985 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14987
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014988 char const *vsSource =
14989 "#version 450\n"
14990 "\n"
14991 "layout(location=0) out float x[2];\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014992 "void main(){\n"
14993 " x[0] = 0; x[1] = 0;\n"
14994 " gl_Position = vec4(1);\n"
14995 "}\n";
14996 char const *fsSource =
14997 "#version 450\n"
14998 "\n"
14999 "layout(location=0) in float x[1];\n"
15000 "layout(location=0) out vec4 color;\n"
15001 "void main(){\n"
15002 " color = vec4(x[0]);\n"
15003 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130015004
15005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15006 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15007
15008 VkPipelineObj pipe(m_device);
15009 pipe.AddColorAttachment();
15010 pipe.AddShader(&vs);
15011 pipe.AddShader(&fs);
15012
15013 VkDescriptorSetObj descriptorSet(m_device);
15014 descriptorSet.AppendDummy();
15015 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15016
15017 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15018
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015019 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130015020}
15021
Karl Schultz6addd812016-02-02 17:17:23 -070015022TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015023 TEST_DESCRIPTION(
15024 "Test that an error is produced for mismatched types across "
15025 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015027
Tony Barbour1fa09702017-03-16 12:09:08 -060015028 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015029 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120015030
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015031 char const *vsSource =
15032 "#version 450\n"
15033 "\n"
15034 "layout(location=0) out int x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015035 "void main(){\n"
15036 " x = 0;\n"
15037 " gl_Position = vec4(1);\n"
15038 "}\n";
15039 char const *fsSource =
15040 "#version 450\n"
15041 "\n"
15042 "layout(location=0) in float x;\n" /* VS writes int */
15043 "layout(location=0) out vec4 color;\n"
15044 "void main(){\n"
15045 " color = vec4(x);\n"
15046 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120015047
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120015050
15051 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015052 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120015053 pipe.AddShader(&vs);
15054 pipe.AddShader(&fs);
15055
Chris Forbesb56af562015-05-25 11:13:17 +120015056 VkDescriptorSetObj descriptorSet(m_device);
15057 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120015059
Tony Barbour5781e8f2015-08-04 16:23:11 -060015060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120015061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015062 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120015063}
15064
Karl Schultz6addd812016-02-02 17:17:23 -070015065TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015066 TEST_DESCRIPTION(
15067 "Test that an error is produced for mismatched types across "
15068 "the vertex->fragment shader interface, when the variable is contained within "
15069 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130015071
Tony Barbour1fa09702017-03-16 12:09:08 -060015072 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130015073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15074
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015075 char const *vsSource =
15076 "#version 450\n"
15077 "\n"
15078 "out block { layout(location=0) int x; } outs;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015079 "void main(){\n"
15080 " outs.x = 0;\n"
15081 " gl_Position = vec4(1);\n"
15082 "}\n";
15083 char const *fsSource =
15084 "#version 450\n"
15085 "\n"
15086 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
15087 "layout(location=0) out vec4 color;\n"
15088 "void main(){\n"
15089 " color = vec4(ins.x);\n"
15090 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130015091
15092 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15093 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15094
15095 VkPipelineObj pipe(m_device);
15096 pipe.AddColorAttachment();
15097 pipe.AddShader(&vs);
15098 pipe.AddShader(&fs);
15099
15100 VkDescriptorSetObj descriptorSet(m_device);
15101 descriptorSet.AppendDummy();
15102 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15103
15104 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15105
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015106 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130015107}
15108
15109TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015110 TEST_DESCRIPTION(
15111 "Test that an error is produced for location mismatches across "
15112 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
15113 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015114 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 +130015115
Tony Barbour1fa09702017-03-16 12:09:08 -060015116 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130015117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15118
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015119 char const *vsSource =
15120 "#version 450\n"
15121 "\n"
15122 "out block { layout(location=1) float x; } outs;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015123 "void main(){\n"
15124 " outs.x = 0;\n"
15125 " gl_Position = vec4(1);\n"
15126 "}\n";
15127 char const *fsSource =
15128 "#version 450\n"
15129 "\n"
15130 "in block { layout(location=0) float x; } ins;\n"
15131 "layout(location=0) out vec4 color;\n"
15132 "void main(){\n"
15133 " color = vec4(ins.x);\n"
15134 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015135
15136 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15137 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15138
15139 VkPipelineObj pipe(m_device);
15140 pipe.AddColorAttachment();
15141 pipe.AddShader(&vs);
15142 pipe.AddShader(&fs);
15143
15144 VkDescriptorSetObj descriptorSet(m_device);
15145 descriptorSet.AppendDummy();
15146 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15147
15148 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15149
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015150 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130015151}
15152
15153TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015154 TEST_DESCRIPTION(
15155 "Test that an error is produced for component mismatches across the "
15156 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
15157 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015158 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 +130015159
Tony Barbour1fa09702017-03-16 12:09:08 -060015160 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130015161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15162
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015163 char const *vsSource =
15164 "#version 450\n"
15165 "\n"
15166 "out block { layout(location=0, component=0) float x; } outs;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015167 "void main(){\n"
15168 " outs.x = 0;\n"
15169 " gl_Position = vec4(1);\n"
15170 "}\n";
15171 char const *fsSource =
15172 "#version 450\n"
15173 "\n"
15174 "in block { layout(location=0, component=1) float x; } ins;\n"
15175 "layout(location=0) out vec4 color;\n"
15176 "void main(){\n"
15177 " color = vec4(ins.x);\n"
15178 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015179
15180 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15181 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15182
15183 VkPipelineObj pipe(m_device);
15184 pipe.AddColorAttachment();
15185 pipe.AddShader(&vs);
15186 pipe.AddShader(&fs);
15187
15188 VkDescriptorSetObj descriptorSet(m_device);
15189 descriptorSet.AppendDummy();
15190 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15191
15192 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015194 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015195}
15196
Chris Forbes1f3b0152016-11-30 12:48:40 +130015197TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
15198 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15199
Tony Barbour1fa09702017-03-16 12:09:08 -060015200 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130015201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15202
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015203 char const *vsSource =
15204 "#version 450\n"
15205 "layout(location=0) out mediump float x;\n"
15206 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15207 char const *fsSource =
15208 "#version 450\n"
15209 "layout(location=0) in highp float x;\n"
15210 "layout(location=0) out vec4 color;\n"
15211 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130015212
15213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15215
15216 VkPipelineObj pipe(m_device);
15217 pipe.AddColorAttachment();
15218 pipe.AddShader(&vs);
15219 pipe.AddShader(&fs);
15220
15221 VkDescriptorSetObj descriptorSet(m_device);
15222 descriptorSet.AppendDummy();
15223 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15224
15225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15226
15227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15228
15229 m_errorMonitor->VerifyFound();
15230}
15231
Chris Forbes870a39e2016-11-30 12:55:56 +130015232TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15233 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15234
Tony Barbour1fa09702017-03-16 12:09:08 -060015235 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15237
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015238 char const *vsSource =
15239 "#version 450\n"
15240 "out block { layout(location=0) mediump float x; };\n"
15241 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15242 char const *fsSource =
15243 "#version 450\n"
15244 "in block { layout(location=0) highp float x; };\n"
15245 "layout(location=0) out vec4 color;\n"
15246 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015247
15248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15250
15251 VkPipelineObj pipe(m_device);
15252 pipe.AddColorAttachment();
15253 pipe.AddShader(&vs);
15254 pipe.AddShader(&fs);
15255
15256 VkDescriptorSetObj descriptorSet(m_device);
15257 descriptorSet.AppendDummy();
15258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15259
15260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15261
15262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15263
15264 m_errorMonitor->VerifyFound();
15265}
15266
Karl Schultz6addd812016-02-02 17:17:23 -070015267TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015268 TEST_DESCRIPTION(
15269 "Test that a warning is produced for a vertex attribute which is "
15270 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015272
Tony Barbour1fa09702017-03-16 12:09:08 -060015273 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015275
15276 VkVertexInputBindingDescription input_binding;
15277 memset(&input_binding, 0, sizeof(input_binding));
15278
15279 VkVertexInputAttributeDescription input_attrib;
15280 memset(&input_attrib, 0, sizeof(input_attrib));
15281 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15282
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015283 char const *vsSource =
15284 "#version 450\n"
15285 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015286 "void main(){\n"
15287 " gl_Position = vec4(1);\n"
15288 "}\n";
15289 char const *fsSource =
15290 "#version 450\n"
15291 "\n"
15292 "layout(location=0) out vec4 color;\n"
15293 "void main(){\n"
15294 " color = vec4(1);\n"
15295 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015296
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015299
15300 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015301 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015302 pipe.AddShader(&vs);
15303 pipe.AddShader(&fs);
15304
15305 pipe.AddVertexInputBindings(&input_binding, 1);
15306 pipe.AddVertexInputAttribs(&input_attrib, 1);
15307
Chris Forbesde136e02015-05-25 11:13:28 +120015308 VkDescriptorSetObj descriptorSet(m_device);
15309 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015310 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015311
Tony Barbour5781e8f2015-08-04 16:23:11 -060015312 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015313
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015314 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015315}
15316
Karl Schultz6addd812016-02-02 17:17:23 -070015317TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015318 TEST_DESCRIPTION(
15319 "Test that a warning is produced for a location mismatch on "
15320 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015322
Tony Barbour1fa09702017-03-16 12:09:08 -060015323 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15325
15326 VkVertexInputBindingDescription input_binding;
15327 memset(&input_binding, 0, sizeof(input_binding));
15328
15329 VkVertexInputAttributeDescription input_attrib;
15330 memset(&input_attrib, 0, sizeof(input_attrib));
15331 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15332
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015333 char const *vsSource =
15334 "#version 450\n"
15335 "\n"
15336 "layout(location=1) in float x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015337 "void main(){\n"
15338 " gl_Position = vec4(x);\n"
15339 "}\n";
15340 char const *fsSource =
15341 "#version 450\n"
15342 "\n"
15343 "layout(location=0) out vec4 color;\n"
15344 "void main(){\n"
15345 " color = vec4(1);\n"
15346 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015347
15348 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15349 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15350
15351 VkPipelineObj pipe(m_device);
15352 pipe.AddColorAttachment();
15353 pipe.AddShader(&vs);
15354 pipe.AddShader(&fs);
15355
15356 pipe.AddVertexInputBindings(&input_binding, 1);
15357 pipe.AddVertexInputAttribs(&input_attrib, 1);
15358
15359 VkDescriptorSetObj descriptorSet(m_device);
15360 descriptorSet.AppendDummy();
15361 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15362
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015363 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015364 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15365
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015366 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015367}
15368
Karl Schultz6addd812016-02-02 17:17:23 -070015369TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015370 TEST_DESCRIPTION(
15371 "Test that an error is produced for a vertex shader input which is not "
15372 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15374 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015375
Tony Barbour1fa09702017-03-16 12:09:08 -060015376 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015378
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015379 char const *vsSource =
15380 "#version 450\n"
15381 "\n"
15382 "layout(location=0) in vec4 x;\n" /* not provided */
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015383 "void main(){\n"
15384 " gl_Position = x;\n"
15385 "}\n";
15386 char const *fsSource =
15387 "#version 450\n"
15388 "\n"
15389 "layout(location=0) out vec4 color;\n"
15390 "void main(){\n"
15391 " color = vec4(1);\n"
15392 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015393
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15395 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015396
15397 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015398 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015399 pipe.AddShader(&vs);
15400 pipe.AddShader(&fs);
15401
Chris Forbes62e8e502015-05-25 11:13:29 +120015402 VkDescriptorSetObj descriptorSet(m_device);
15403 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015404 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015405
Tony Barbour5781e8f2015-08-04 16:23:11 -060015406 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015407
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015408 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015409}
15410
Karl Schultz6addd812016-02-02 17:17:23 -070015411TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015412 TEST_DESCRIPTION(
15413 "Test that an error is produced for a mismatch between the "
15414 "fundamental type (float/int/uint) of an attribute and the "
15415 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015416 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 -060015417
Tony Barbour1fa09702017-03-16 12:09:08 -060015418 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015420
15421 VkVertexInputBindingDescription input_binding;
15422 memset(&input_binding, 0, sizeof(input_binding));
15423
15424 VkVertexInputAttributeDescription input_attrib;
15425 memset(&input_attrib, 0, sizeof(input_attrib));
15426 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15427
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015428 char const *vsSource =
15429 "#version 450\n"
15430 "\n"
15431 "layout(location=0) in int x;\n" /* attrib provided float */
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015432 "void main(){\n"
15433 " gl_Position = vec4(x);\n"
15434 "}\n";
15435 char const *fsSource =
15436 "#version 450\n"
15437 "\n"
15438 "layout(location=0) out vec4 color;\n"
15439 "void main(){\n"
15440 " color = vec4(1);\n"
15441 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015442
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015443 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15444 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015445
15446 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015447 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015448 pipe.AddShader(&vs);
15449 pipe.AddShader(&fs);
15450
15451 pipe.AddVertexInputBindings(&input_binding, 1);
15452 pipe.AddVertexInputAttribs(&input_attrib, 1);
15453
Chris Forbesc97d98e2015-05-25 11:13:31 +120015454 VkDescriptorSetObj descriptorSet(m_device);
15455 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015456 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015457
Tony Barbour5781e8f2015-08-04 16:23:11 -060015458 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015459
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015460 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015461}
15462
Chris Forbesc68b43c2016-04-06 11:18:47 +120015463TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015464 TEST_DESCRIPTION(
15465 "Test that an error is produced for a pipeline containing multiple "
15466 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15468 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015469
Tony Barbour1fa09702017-03-16 12:09:08 -060015470 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015471 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15472
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015473 char const *vsSource =
15474 "#version 450\n"
15475 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015476 "void main(){\n"
15477 " gl_Position = vec4(1);\n"
15478 "}\n";
15479 char const *fsSource =
15480 "#version 450\n"
15481 "\n"
15482 "layout(location=0) out vec4 color;\n"
15483 "void main(){\n"
15484 " color = vec4(1);\n"
15485 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015486
15487 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15488 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15489
15490 VkPipelineObj pipe(m_device);
15491 pipe.AddColorAttachment();
15492 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015493 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015494 pipe.AddShader(&fs);
15495
15496 VkDescriptorSetObj descriptorSet(m_device);
15497 descriptorSet.AppendDummy();
15498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15499
15500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015502 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015503}
15504
Chris Forbes82ff92a2016-09-09 10:50:24 +120015505TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015507
Tony Barbour1fa09702017-03-16 12:09:08 -060015508 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15510
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015511 char const *vsSource =
15512 "#version 450\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015513 "void main(){\n"
15514 " gl_Position = vec4(0);\n"
15515 "}\n";
15516 char const *fsSource =
15517 "#version 450\n"
15518 "\n"
15519 "layout(location=0) out vec4 color;\n"
15520 "void main(){\n"
15521 " color = vec4(1);\n"
15522 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015523
15524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15526
15527 VkPipelineObj pipe(m_device);
15528 pipe.AddColorAttachment();
15529 pipe.AddShader(&vs);
15530 pipe.AddShader(&fs);
15531
15532 VkDescriptorSetObj descriptorSet(m_device);
15533 descriptorSet.AppendDummy();
15534 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15535
15536 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15537
15538 m_errorMonitor->VerifyFound();
15539}
15540
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015541TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15543 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15544 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015545
Tony Barbour1fa09702017-03-16 12:09:08 -060015546 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15548
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015549 char const *vsSource =
15550 "#version 450\n"
15551 "void main(){ gl_Position = vec4(0); }\n";
15552 char const *fsSource =
15553 "#version 450\n"
15554 "\n"
15555 "layout(location=0) out vec4 color;\n"
15556 "void main(){\n"
15557 " color = vec4(1);\n"
15558 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015559
15560 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15561 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15562
15563 VkPipelineObj pipe(m_device);
15564 pipe.AddColorAttachment();
15565 pipe.AddShader(&vs);
15566 pipe.AddShader(&fs);
15567
15568 VkDescriptorSetObj descriptorSet(m_device);
15569 descriptorSet.AppendDummy();
15570 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15571
15572 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015573 {
15574 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15575 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15576 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015577 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015578 {
15579 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15580 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15581 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015582 },
15583 };
15584 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015585 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015586 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015587 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15588 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015589 VkRenderPass rp;
15590 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15591 ASSERT_VK_SUCCESS(err);
15592
15593 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15594
15595 m_errorMonitor->VerifyFound();
15596
15597 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15598}
15599
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015600TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015601 TEST_DESCRIPTION(
15602 "Test that an error is produced for a variable output from "
15603 "the TCS without the patch decoration, but consumed in the TES "
15604 "with the decoration.");
15605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15606 "is per-vertex in tessellation control shader stage "
15607 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015608
Tony Barbour1fa09702017-03-16 12:09:08 -060015609 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15611
Chris Forbesc1e852d2016-04-04 19:26:42 +120015612 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015613 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015614 return;
15615 }
15616
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015617 char const *vsSource =
15618 "#version 450\n"
15619 "void main(){}\n";
15620 char const *tcsSource =
15621 "#version 450\n"
15622 "layout(location=0) out int x[];\n"
15623 "layout(vertices=3) out;\n"
15624 "void main(){\n"
15625 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15626 " gl_TessLevelInner[0] = 1;\n"
15627 " x[gl_InvocationID] = gl_InvocationID;\n"
15628 "}\n";
15629 char const *tesSource =
15630 "#version 450\n"
15631 "layout(triangles, equal_spacing, cw) in;\n"
15632 "layout(location=0) patch in int x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015633 "void main(){\n"
15634 " gl_Position.xyz = gl_TessCoord;\n"
15635 " gl_Position.w = x;\n"
15636 "}\n";
15637 char const *fsSource =
15638 "#version 450\n"
15639 "layout(location=0) out vec4 color;\n"
15640 "void main(){\n"
15641 " color = vec4(1);\n"
15642 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015643
15644 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15645 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15646 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15647 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15648
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015649 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15650 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015651
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015652 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015653
15654 VkPipelineObj pipe(m_device);
15655 pipe.SetInputAssembly(&iasci);
15656 pipe.SetTessellation(&tsci);
15657 pipe.AddColorAttachment();
15658 pipe.AddShader(&vs);
15659 pipe.AddShader(&tcs);
15660 pipe.AddShader(&tes);
15661 pipe.AddShader(&fs);
15662
15663 VkDescriptorSetObj descriptorSet(m_device);
15664 descriptorSet.AppendDummy();
15665 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15666
15667 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15668
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015669 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015670}
15671
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015672TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15673 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15674
15675 ASSERT_NO_FATAL_FAILURE(Init());
15676 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15677
15678 if (!m_device->phy().features().tessellationShader) {
15679 printf(" Device does not support tessellation shaders; skipped.\n");
15680 return;
15681 }
15682
15683 char const *vsSource =
15684 "#version 450\n"
15685 "void main(){}\n";
15686 char const *tcsSource =
15687 "#version 450\n"
15688 "layout(vertices=3) out;\n"
15689 "void main(){\n"
15690 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15691 " gl_TessLevelInner[0] = 1;\n"
15692 "}\n";
15693 char const *tesSource =
15694 "#version 450\n"
15695 "layout(triangles, equal_spacing, cw) in;\n"
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015696 "void main(){\n"
15697 " gl_Position.xyz = gl_TessCoord;\n"
15698 " gl_Position.w = 0;\n"
15699 "}\n";
15700 char const *fsSource =
15701 "#version 450\n"
15702 "layout(location=0) out vec4 color;\n"
15703 "void main(){\n"
15704 " color = vec4(1);\n"
15705 "}\n";
15706
15707 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15708 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15709 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15710 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15711
15712 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15713 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15714
15715 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15716
15717 VkDescriptorSetObj descriptorSet(m_device);
15718 descriptorSet.AppendDummy();
15719 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15720
15721 {
15722 VkPipelineObj pipe(m_device);
15723 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15724 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15725 pipe.SetInputAssembly(&iasci_bad);
15726 pipe.AddColorAttachment();
15727 pipe.AddShader(&vs);
15728 pipe.AddShader(&fs);
15729
15730 // Pass a tess control shader without a tess eval shader
15731 pipe.AddShader(&tcs);
15732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15733 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15734 m_errorMonitor->VerifyFound();
15735 }
15736
15737 {
15738 VkPipelineObj pipe(m_device);
15739 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15740 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15741 pipe.SetInputAssembly(&iasci_bad);
15742 pipe.AddColorAttachment();
15743 pipe.AddShader(&vs);
15744 pipe.AddShader(&fs);
15745
15746 // Pass a tess eval shader without a tess control shader
15747 pipe.AddShader(&tes);
15748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15749 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15750 m_errorMonitor->VerifyFound();
15751 }
15752
15753 {
15754 VkPipelineObj pipe(m_device);
15755 pipe.SetInputAssembly(&iasci);
15756 pipe.AddColorAttachment();
15757 pipe.AddShader(&vs);
15758 pipe.AddShader(&fs);
15759
15760 // Pass patch topology without tessellation shaders
15761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15762 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15763 m_errorMonitor->VerifyFound();
15764
15765 pipe.AddShader(&tcs);
15766 pipe.AddShader(&tes);
15767 // Pass a NULL pTessellationState (with active tessellation shader stages)
15768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15769 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15770 m_errorMonitor->VerifyFound();
15771
15772 // Pass an invalid pTessellationState (bad sType)
15773 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15774 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15775 pipe.SetTessellation(&tsci_bad);
15776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15777 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15778 m_errorMonitor->VerifyFound();
15779 // Pass out-of-range patchControlPoints
15780 tsci_bad = tsci;
15781 tsci_bad.patchControlPoints = 0;
15782 pipe.SetTessellation(&tsci);
15783 pipe.SetTessellation(&tsci_bad);
15784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15786 m_errorMonitor->VerifyFound();
15787 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15788 pipe.SetTessellation(&tsci_bad);
15789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15790 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15791 m_errorMonitor->VerifyFound();
15792 pipe.SetTessellation(&tsci);
15793
15794 // Pass an invalid primitive topology
15795 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15796 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15797 pipe.SetInputAssembly(&iasci_bad);
15798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15799 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15800 m_errorMonitor->VerifyFound();
15801 pipe.SetInputAssembly(&iasci);
15802 }
15803}
15804
Karl Schultz6addd812016-02-02 17:17:23 -070015805TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015806 TEST_DESCRIPTION(
15807 "Test that an error is produced for a vertex attribute setup where multiple "
15808 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15810 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015811
Tony Barbour1fa09702017-03-16 12:09:08 -060015812 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015814
15815 /* Two binding descriptions for binding 0 */
15816 VkVertexInputBindingDescription input_bindings[2];
15817 memset(input_bindings, 0, sizeof(input_bindings));
15818
15819 VkVertexInputAttributeDescription input_attrib;
15820 memset(&input_attrib, 0, sizeof(input_attrib));
15821 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15822
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015823 char const *vsSource =
15824 "#version 450\n"
15825 "\n"
15826 "layout(location=0) in float x;\n" /* attrib provided float */
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015827 "void main(){\n"
15828 " gl_Position = vec4(x);\n"
15829 "}\n";
15830 char const *fsSource =
15831 "#version 450\n"
15832 "\n"
15833 "layout(location=0) out vec4 color;\n"
15834 "void main(){\n"
15835 " color = vec4(1);\n"
15836 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015837
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015838 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15839 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015840
15841 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015842 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015843 pipe.AddShader(&vs);
15844 pipe.AddShader(&fs);
15845
15846 pipe.AddVertexInputBindings(input_bindings, 2);
15847 pipe.AddVertexInputAttribs(&input_attrib, 1);
15848
Chris Forbes280ba2c2015-06-12 11:16:41 +120015849 VkDescriptorSetObj descriptorSet(m_device);
15850 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015851 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015852
Tony Barbour5781e8f2015-08-04 16:23:11 -060015853 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015854
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015855 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015856}
Chris Forbes8f68b562015-05-25 11:13:32 +120015857
Karl Schultz6addd812016-02-02 17:17:23 -070015858TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015859 TEST_DESCRIPTION(
15860 "Test that an error is produced for a fragment shader which does not "
15861 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015863
Tony Barbour1fa09702017-03-16 12:09:08 -060015864 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015865
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015866 char const *vsSource =
15867 "#version 450\n"
15868 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015869 "void main(){\n"
15870 " gl_Position = vec4(1);\n"
15871 "}\n";
15872 char const *fsSource =
15873 "#version 450\n"
15874 "\n"
15875 "void main(){\n"
15876 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015877
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015880
15881 VkPipelineObj pipe(m_device);
15882 pipe.AddShader(&vs);
15883 pipe.AddShader(&fs);
15884
Chia-I Wu08accc62015-07-07 11:50:03 +080015885 /* set up CB 0, not written */
15886 pipe.AddColorAttachment();
15887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015888
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015889 VkDescriptorSetObj descriptorSet(m_device);
15890 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015891 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015892
Tony Barbour5781e8f2015-08-04 16:23:11 -060015893 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015894
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015895 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015896}
15897
Karl Schultz6addd812016-02-02 17:17:23 -070015898TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015899 TEST_DESCRIPTION(
15900 "Test that a warning is produced for a fragment shader which provides a spurious "
15901 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015903 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015904
Tony Barbour1fa09702017-03-16 12:09:08 -060015905 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015906
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015907 char const *vsSource =
15908 "#version 450\n"
15909 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015910 "void main(){\n"
15911 " gl_Position = vec4(1);\n"
15912 "}\n";
15913 char const *fsSource =
15914 "#version 450\n"
15915 "\n"
15916 "layout(location=0) out vec4 x;\n"
15917 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15918 "void main(){\n"
15919 " x = vec4(1);\n"
15920 " y = vec4(1);\n"
15921 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015922
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015923 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15924 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015925
15926 VkPipelineObj pipe(m_device);
15927 pipe.AddShader(&vs);
15928 pipe.AddShader(&fs);
15929
Chia-I Wu08accc62015-07-07 11:50:03 +080015930 /* set up CB 0, not written */
15931 pipe.AddColorAttachment();
15932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015933 /* FS writes CB 1, but we don't configure it */
15934
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015935 VkDescriptorSetObj descriptorSet(m_device);
15936 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015937 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015938
Tony Barbour5781e8f2015-08-04 16:23:11 -060015939 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015940
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015941 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015942}
15943
Karl Schultz6addd812016-02-02 17:17:23 -070015944TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015945 TEST_DESCRIPTION(
15946 "Test that an error is produced for a mismatch between the fundamental "
15947 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015949
Tony Barbour1fa09702017-03-16 12:09:08 -060015950 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015951
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015952 char const *vsSource =
15953 "#version 450\n"
15954 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015955 "void main(){\n"
15956 " gl_Position = vec4(1);\n"
15957 "}\n";
15958 char const *fsSource =
15959 "#version 450\n"
15960 "\n"
15961 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15962 "void main(){\n"
15963 " x = ivec4(1);\n"
15964 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015965
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015966 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15967 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015968
15969 VkPipelineObj pipe(m_device);
15970 pipe.AddShader(&vs);
15971 pipe.AddShader(&fs);
15972
Chia-I Wu08accc62015-07-07 11:50:03 +080015973 /* set up CB 0; type is UNORM by default */
15974 pipe.AddColorAttachment();
15975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015976
Chris Forbesa36d69e2015-05-25 11:13:44 +120015977 VkDescriptorSetObj descriptorSet(m_device);
15978 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015979 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015980
Tony Barbour5781e8f2015-08-04 16:23:11 -060015981 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015982
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015983 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015984}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015985
Karl Schultz6addd812016-02-02 17:17:23 -070015986TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015987 TEST_DESCRIPTION(
15988 "Test that an error is produced for a shader consuming a uniform "
15989 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015991
Tony Barbour1fa09702017-03-16 12:09:08 -060015992 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015993
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015994 char const *vsSource =
15995 "#version 450\n"
15996 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015997 "void main(){\n"
15998 " gl_Position = vec4(1);\n"
15999 "}\n";
16000 char const *fsSource =
16001 "#version 450\n"
16002 "\n"
16003 "layout(location=0) out vec4 x;\n"
16004 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
16005 "void main(){\n"
16006 " x = vec4(bar.y);\n"
16007 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120016008
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016009 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16010 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120016011
Chris Forbes556c76c2015-08-14 12:04:59 +120016012 VkPipelineObj pipe(m_device);
16013 pipe.AddShader(&vs);
16014 pipe.AddShader(&fs);
16015
16016 /* set up CB 0; type is UNORM by default */
16017 pipe.AddColorAttachment();
16018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16019
16020 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016021 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120016022
16023 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016025 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120016026}
16027
Chris Forbes5c59e902016-02-26 16:56:09 +130016028TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016029 TEST_DESCRIPTION(
16030 "Test that an error is produced for a shader consuming push constants "
16031 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130016033
Tony Barbour1fa09702017-03-16 12:09:08 -060016034 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130016035
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016036 char const *vsSource =
16037 "#version 450\n"
16038 "\n"
16039 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016040 "void main(){\n"
16041 " gl_Position = vec4(consts.x);\n"
16042 "}\n";
16043 char const *fsSource =
16044 "#version 450\n"
16045 "\n"
16046 "layout(location=0) out vec4 x;\n"
16047 "void main(){\n"
16048 " x = vec4(1);\n"
16049 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130016050
16051 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16052 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16053
16054 VkPipelineObj pipe(m_device);
16055 pipe.AddShader(&vs);
16056 pipe.AddShader(&fs);
16057
16058 /* set up CB 0; type is UNORM by default */
16059 pipe.AddColorAttachment();
16060 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16061
16062 VkDescriptorSetObj descriptorSet(m_device);
16063 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16064
16065 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16066
16067 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016068 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130016069}
16070
Chris Forbes3fb17902016-08-22 14:57:55 +120016071TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016072 TEST_DESCRIPTION(
16073 "Test that an error is produced for a shader consuming an input attachment "
16074 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120016075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16076 "consumes input attachment index 0 but not provided in subpass");
16077
Tony Barbour1fa09702017-03-16 12:09:08 -060016078 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120016079
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016080 char const *vsSource =
16081 "#version 450\n"
16082 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016083 "void main(){\n"
16084 " gl_Position = vec4(1);\n"
16085 "}\n";
16086 char const *fsSource =
16087 "#version 450\n"
16088 "\n"
16089 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16090 "layout(location=0) out vec4 color;\n"
16091 "void main() {\n"
16092 " color = subpassLoad(x);\n"
16093 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120016094
16095 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16096 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16097
16098 VkPipelineObj pipe(m_device);
16099 pipe.AddShader(&vs);
16100 pipe.AddShader(&fs);
16101 pipe.AddColorAttachment();
16102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016104 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16105 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120016106 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016107 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016108 ASSERT_VK_SUCCESS(err);
16109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016110 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120016111 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016112 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016113 ASSERT_VK_SUCCESS(err);
16114
16115 // error here.
16116 pipe.CreateVKPipeline(pl, renderPass());
16117
16118 m_errorMonitor->VerifyFound();
16119
16120 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16121 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16122}
16123
Chris Forbes5a9a0472016-08-22 16:02:09 +120016124TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016125 TEST_DESCRIPTION(
16126 "Test that an error is produced for a shader consuming an input attachment "
16127 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120016128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16129 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
16130
Tony Barbour1fa09702017-03-16 12:09:08 -060016131 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120016132
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016133 char const *vsSource =
16134 "#version 450\n"
16135 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016136 "void main(){\n"
16137 " gl_Position = vec4(1);\n"
16138 "}\n";
16139 char const *fsSource =
16140 "#version 450\n"
16141 "\n"
16142 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16143 "layout(location=0) out vec4 color;\n"
16144 "void main() {\n"
16145 " color = subpassLoad(x);\n"
16146 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016147
16148 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16149 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16150
16151 VkPipelineObj pipe(m_device);
16152 pipe.AddShader(&vs);
16153 pipe.AddShader(&fs);
16154 pipe.AddColorAttachment();
16155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016157 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16158 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016159 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016160 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016161 ASSERT_VK_SUCCESS(err);
16162
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016163 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016164 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016165 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016166 ASSERT_VK_SUCCESS(err);
16167
16168 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016169 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16170 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16171 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16172 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16173 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 +120016174 };
16175 VkAttachmentReference color = {
16176 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16177 };
16178 VkAttachmentReference input = {
16179 1, VK_IMAGE_LAYOUT_GENERAL,
16180 };
16181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016182 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016184 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016185 VkRenderPass rp;
16186 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16187 ASSERT_VK_SUCCESS(err);
16188
16189 // error here.
16190 pipe.CreateVKPipeline(pl, rp);
16191
16192 m_errorMonitor->VerifyFound();
16193
16194 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16195 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16196 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16197}
16198
Chris Forbes541f7b02016-08-22 15:30:27 +120016199TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016200 TEST_DESCRIPTION(
16201 "Test that an error is produced for a shader consuming an input attachment "
16202 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016204 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016205
Tony Barbour1fa09702017-03-16 12:09:08 -060016206 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016207
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016208 char const *vsSource =
16209 "#version 450\n"
16210 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016211 "void main(){\n"
16212 " gl_Position = vec4(1);\n"
16213 "}\n";
16214 char const *fsSource =
16215 "#version 450\n"
16216 "\n"
16217 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16218 "layout(location=0) out vec4 color;\n"
16219 "void main() {\n"
16220 " color = subpassLoad(xs[0]);\n"
16221 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016222
16223 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16224 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16225
16226 VkPipelineObj pipe(m_device);
16227 pipe.AddShader(&vs);
16228 pipe.AddShader(&fs);
16229 pipe.AddColorAttachment();
16230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16231
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016232 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16233 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016234 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016235 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016236 ASSERT_VK_SUCCESS(err);
16237
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016238 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016239 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016240 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016241 ASSERT_VK_SUCCESS(err);
16242
16243 // error here.
16244 pipe.CreateVKPipeline(pl, renderPass());
16245
16246 m_errorMonitor->VerifyFound();
16247
16248 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16249 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16250}
16251
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016252TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016253 TEST_DESCRIPTION(
16254 "Test that an error is produced for a compute pipeline consuming a "
16255 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016257
Tony Barbour1fa09702017-03-16 12:09:08 -060016258 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016259
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016260 char const *csSource =
16261 "#version 450\n"
16262 "\n"
16263 "layout(local_size_x=1) in;\n"
16264 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16265 "void main(){\n"
16266 " x = vec4(1);\n"
16267 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016268
16269 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16270
16271 VkDescriptorSetObj descriptorSet(m_device);
16272 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16273
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016274 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16275 nullptr,
16276 0,
16277 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16278 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16279 descriptorSet.GetPipelineLayout(),
16280 VK_NULL_HANDLE,
16281 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016282
16283 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016284 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016285
16286 m_errorMonitor->VerifyFound();
16287
16288 if (err == VK_SUCCESS) {
16289 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16290 }
16291}
16292
Chris Forbes22a9b092016-07-19 14:34:05 +120016293TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016294 TEST_DESCRIPTION(
16295 "Test that an error is produced for a pipeline consuming a "
16296 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16298 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016299
Tony Barbour1fa09702017-03-16 12:09:08 -060016300 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016301
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016302 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16303 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016304 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016305 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016306 ASSERT_VK_SUCCESS(err);
16307
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016308 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016309 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016310 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016311 ASSERT_VK_SUCCESS(err);
16312
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016313 char const *csSource =
16314 "#version 450\n"
16315 "\n"
16316 "layout(local_size_x=1) in;\n"
16317 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16318 "void main() {\n"
16319 " x.x = 1.0f;\n"
16320 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016321 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16322
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016323 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16324 nullptr,
16325 0,
16326 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16327 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16328 pl,
16329 VK_NULL_HANDLE,
16330 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016331
16332 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016333 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016334
16335 m_errorMonitor->VerifyFound();
16336
16337 if (err == VK_SUCCESS) {
16338 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16339 }
16340
16341 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16342 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16343}
16344
Chris Forbes50020592016-07-27 13:52:41 +120016345TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016346 TEST_DESCRIPTION(
16347 "Test that an error is produced when an image view type "
16348 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016350 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 +120016351
Tony Barbour1fa09702017-03-16 12:09:08 -060016352 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016355 char const *vsSource =
16356 "#version 450\n"
16357 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016358 "void main() { gl_Position = vec4(0); }\n";
16359 char const *fsSource =
16360 "#version 450\n"
16361 "\n"
16362 "layout(set=0, binding=0) uniform sampler3D s;\n"
16363 "layout(location=0) out vec4 color;\n"
16364 "void main() {\n"
16365 " color = texture(s, vec3(0));\n"
16366 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016367 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16368 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16369
16370 VkPipelineObj pipe(m_device);
16371 pipe.AddShader(&vs);
16372 pipe.AddShader(&fs);
16373 pipe.AddColorAttachment();
16374
16375 VkTextureObj texture(m_device, nullptr);
16376 VkSamplerObj sampler(m_device);
16377
16378 VkDescriptorSetObj descriptorSet(m_device);
16379 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16380 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16381
16382 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16383 ASSERT_VK_SUCCESS(err);
16384
Tony Barbour552f6c02016-12-21 14:34:07 -070016385 m_commandBuffer->BeginCommandBuffer();
16386 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016387
16388 m_commandBuffer->BindPipeline(pipe);
16389 m_commandBuffer->BindDescriptorSet(descriptorSet);
16390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016391 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016392 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016393 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016394 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16395
16396 // error produced here.
16397 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16398
16399 m_errorMonitor->VerifyFound();
16400
Tony Barbour552f6c02016-12-21 14:34:07 -070016401 m_commandBuffer->EndRenderPass();
16402 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016403}
16404
Chris Forbes5533bfc2016-07-27 14:12:34 +120016405TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016406 TEST_DESCRIPTION(
16407 "Test that an error is produced when a multisampled images "
16408 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016411
Tony Barbour1fa09702017-03-16 12:09:08 -060016412 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16414
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016415 char const *vsSource =
16416 "#version 450\n"
16417 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016418 "void main() { gl_Position = vec4(0); }\n";
16419 char const *fsSource =
16420 "#version 450\n"
16421 "\n"
16422 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16423 "layout(location=0) out vec4 color;\n"
16424 "void main() {\n"
16425 " color = texelFetch(s, ivec2(0), 0);\n"
16426 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016427 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16428 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16429
16430 VkPipelineObj pipe(m_device);
16431 pipe.AddShader(&vs);
16432 pipe.AddShader(&fs);
16433 pipe.AddColorAttachment();
16434
16435 VkTextureObj texture(m_device, nullptr);
16436 VkSamplerObj sampler(m_device);
16437
16438 VkDescriptorSetObj descriptorSet(m_device);
16439 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16440 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16441
16442 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16443 ASSERT_VK_SUCCESS(err);
16444
Tony Barbour552f6c02016-12-21 14:34:07 -070016445 m_commandBuffer->BeginCommandBuffer();
16446 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016447
16448 m_commandBuffer->BindPipeline(pipe);
16449 m_commandBuffer->BindDescriptorSet(descriptorSet);
16450
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016451 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016452 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016453 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016454 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16455
16456 // error produced here.
16457 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16458
16459 m_errorMonitor->VerifyFound();
16460
Tony Barbour552f6c02016-12-21 14:34:07 -070016461 m_commandBuffer->EndRenderPass();
16462 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016463}
16464
Mark Youngc48c4c12016-04-11 14:26:49 -060016465TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016466 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016467
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016468 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16469 {
16470 VkFormatProperties properties;
16471 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16472 if (properties.optimalTilingFeatures == 0) {
16473 printf(" Image format not supported; skipped.\n");
16474 return;
16475 }
16476 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016477
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016478 VkImageCreateInfo info = {};
16479 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16480 info.pNext = NULL;
16481 info.imageType = VK_IMAGE_TYPE_2D;
16482 info.format = format;
16483 info.extent.height = 32;
16484 info.extent.depth = 1;
16485 info.mipLevels = 1;
16486 info.arrayLayers = 1;
16487 info.samples = VK_SAMPLE_COUNT_1_BIT;
16488 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16489 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16490 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016491
16492 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016493 {
16494 VkImageFormatProperties properties;
16495 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16496 info.tiling, info.usage, info.flags, &properties);
16497 ASSERT_VK_SUCCESS(result);
16498 info.extent.width = properties.maxExtent.width + 1;
16499 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016500
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016501 VkImage image;
16502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16503 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016504 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016505}
16506
Mark Youngc48c4c12016-04-11 14:26:49 -060016507TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016509
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016510 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16511 {
16512 VkFormatProperties properties;
16513 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16514 if (properties.optimalTilingFeatures == 0) {
16515 printf(" Image format not supported; skipped.\n");
16516 return;
16517 }
16518 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016519
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016520 VkImageCreateInfo info = {};
16521 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16522 info.pNext = NULL;
16523 info.imageType = VK_IMAGE_TYPE_2D;
16524 info.format = format;
16525 info.extent.height = 32;
16526 info.extent.depth = 1;
16527 info.mipLevels = 1;
16528 info.arrayLayers = 1;
16529 info.samples = VK_SAMPLE_COUNT_1_BIT;
16530 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16531 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16532 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016533
16534 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016535 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016536
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016537 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016539 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16540 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016541 m_errorMonitor->VerifyFound();
16542}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016543
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016544TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016545 TEST_DESCRIPTION(
16546 "Create a render pass with an attachment description "
16547 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016548
Tony Barbour1fa09702017-03-16 12:09:08 -060016549 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16551
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016553
16554 VkAttachmentReference color_attach = {};
16555 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16556 color_attach.attachment = 0;
16557 VkSubpassDescription subpass = {};
16558 subpass.colorAttachmentCount = 1;
16559 subpass.pColorAttachments = &color_attach;
16560
16561 VkRenderPassCreateInfo rpci = {};
16562 rpci.subpassCount = 1;
16563 rpci.pSubpasses = &subpass;
16564 rpci.attachmentCount = 1;
16565 VkAttachmentDescription attach_desc = {};
16566 attach_desc.format = VK_FORMAT_UNDEFINED;
16567 rpci.pAttachments = &attach_desc;
16568 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16569 VkRenderPass rp;
16570 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16571
16572 m_errorMonitor->VerifyFound();
16573
16574 if (result == VK_SUCCESS) {
16575 vkDestroyRenderPass(m_device->device(), rp, NULL);
16576 }
16577}
16578
Mark Youngd339ba32016-05-30 13:28:35 -060016579TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16580 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016582 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016583
Tony Barbour1fa09702017-03-16 12:09:08 -060016584 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016585
16586 // Create an image and try to create a view with no memory backing the image
16587 VkImage image;
16588
16589 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16590 const int32_t tex_width = 32;
16591 const int32_t tex_height = 32;
16592
16593 VkImageCreateInfo image_create_info = {};
16594 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16595 image_create_info.pNext = NULL;
16596 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16597 image_create_info.format = tex_format;
16598 image_create_info.extent.width = tex_width;
16599 image_create_info.extent.height = tex_height;
16600 image_create_info.extent.depth = 1;
16601 image_create_info.mipLevels = 1;
16602 image_create_info.arrayLayers = 1;
16603 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16604 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16605 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16606 image_create_info.flags = 0;
16607
16608 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16609 ASSERT_VK_SUCCESS(err);
16610
16611 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016612 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016613 image_view_create_info.image = image;
16614 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16615 image_view_create_info.format = tex_format;
16616 image_view_create_info.subresourceRange.layerCount = 1;
16617 image_view_create_info.subresourceRange.baseMipLevel = 0;
16618 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016619 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016620
16621 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016622 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016623
16624 m_errorMonitor->VerifyFound();
16625 vkDestroyImage(m_device->device(), image, NULL);
16626 // If last error is success, it still created the view, so delete it.
16627 if (err == VK_SUCCESS) {
16628 vkDestroyImageView(m_device->device(), view, NULL);
16629 }
Mark Youngd339ba32016-05-30 13:28:35 -060016630}
16631
Karl Schultz6addd812016-02-02 17:17:23 -070016632TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016633 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016635
Tony Barbour1fa09702017-03-16 12:09:08 -060016636 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016637
Karl Schultz6addd812016-02-02 17:17:23 -070016638 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016639 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016640 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016641 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016642
16643 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016644 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016645 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016646 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16647 image_view_create_info.format = tex_format;
16648 image_view_create_info.subresourceRange.baseMipLevel = 0;
16649 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016650 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016651 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016652 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016653
16654 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016655 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016656
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016657 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016658}
16659
Mike Weiblena1e13f42017-02-09 21:25:59 -070016660TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16661 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16662
Tony Barbour1fa09702017-03-16 12:09:08 -060016663 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016664 VkSubresourceLayout subres_layout = {};
16665
16666 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16667 {
16668 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16669 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016670 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016671 ASSERT_TRUE(img.initialized());
16672
16673 VkImageSubresource subres = {};
16674 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16675 subres.mipLevel = 0;
16676 subres.arrayLayer = 0;
16677
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16679 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16680 m_errorMonitor->VerifyFound();
16681 }
16682
16683 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16684 {
16685 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016686 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016687 ASSERT_TRUE(img.initialized());
16688
16689 VkImageSubresource subres = {};
16690 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16691 subres.mipLevel = 0;
16692 subres.arrayLayer = 0;
16693
16694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16696 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16697 m_errorMonitor->VerifyFound();
16698 }
16699
16700 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16701 {
16702 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016703 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016704 ASSERT_TRUE(img.initialized());
16705
16706 VkImageSubresource subres = {};
16707 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16708 subres.mipLevel = 1; // ERROR: triggers VU 00739
16709 subres.arrayLayer = 0;
16710
16711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16712 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16713 m_errorMonitor->VerifyFound();
16714 }
16715
16716 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16717 {
16718 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016719 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016720 ASSERT_TRUE(img.initialized());
16721
16722 VkImageSubresource subres = {};
16723 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16724 subres.mipLevel = 0;
16725 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16726
16727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16728 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16729 m_errorMonitor->VerifyFound();
16730 }
16731}
16732
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016733TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016734 VkResult err;
16735 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016736
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016738
Tony Barbour1fa09702017-03-16 12:09:08 -060016739 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016740
16741 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016742 VkImage srcImage;
16743 VkImage dstImage;
16744 VkDeviceMemory srcMem;
16745 VkDeviceMemory destMem;
16746 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016747
16748 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016749 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16750 image_create_info.pNext = NULL;
16751 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16752 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16753 image_create_info.extent.width = 32;
16754 image_create_info.extent.height = 32;
16755 image_create_info.extent.depth = 1;
16756 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016757 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016758 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16759 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16760 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16761 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016762
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016763 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016764 ASSERT_VK_SUCCESS(err);
16765
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016766 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016767 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016768 ASSERT_VK_SUCCESS(err);
16769
16770 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016771 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016772 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16773 memAlloc.pNext = NULL;
16774 memAlloc.allocationSize = 0;
16775 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016776
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016777 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016778 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016779 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016780 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016781 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016782 ASSERT_VK_SUCCESS(err);
16783
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016784 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016785 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016786 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016787 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016788 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016789 ASSERT_VK_SUCCESS(err);
16790
16791 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16792 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016793 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016794 ASSERT_VK_SUCCESS(err);
16795
Tony Barbour552f6c02016-12-21 14:34:07 -070016796 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016797 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016798 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016799 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016800 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016801 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016802 copyRegion.srcOffset.x = 0;
16803 copyRegion.srcOffset.y = 0;
16804 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016805 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016806 copyRegion.dstSubresource.mipLevel = 0;
16807 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016808 // Introduce failure by forcing the dst layerCount to differ from src
16809 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016810 copyRegion.dstOffset.x = 0;
16811 copyRegion.dstOffset.y = 0;
16812 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016813 copyRegion.extent.width = 1;
16814 copyRegion.extent.height = 1;
16815 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016816 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016817 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016818
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016819 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016820
Chia-I Wuf7458c52015-10-26 21:10:41 +080016821 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016822 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016823 vkFreeMemory(m_device->device(), srcMem, NULL);
16824 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016825}
16826
Tony Barbourd6673642016-05-05 14:46:39 -060016827TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016828 TEST_DESCRIPTION("Creating images with unsuported formats ");
16829
Tony Barbour1fa09702017-03-16 12:09:08 -060016830 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016832
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016833 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016834 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016835 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016836 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16837 image_create_info.format = VK_FORMAT_UNDEFINED;
16838 image_create_info.extent.width = 32;
16839 image_create_info.extent.height = 32;
16840 image_create_info.extent.depth = 1;
16841 image_create_info.mipLevels = 1;
16842 image_create_info.arrayLayers = 1;
16843 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16844 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16845 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016846
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16848 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016849
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016850 VkImage image;
16851 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016852 m_errorMonitor->VerifyFound();
16853
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016854 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016855 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016856 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16857 VkFormat format = static_cast<VkFormat>(f);
16858 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016859 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016860 unsupported = format;
16861 break;
16862 }
16863 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016864
Tony Barbourd6673642016-05-05 14:46:39 -060016865 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016866 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016868
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016869 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016870 m_errorMonitor->VerifyFound();
16871 }
16872}
16873
16874TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016875 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16876
Tony Barbour1fa09702017-03-16 12:09:08 -060016877 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016878 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016879 if (!depth_format) {
16880 return;
16881 }
Tony Barbourd6673642016-05-05 14:46:39 -060016882
16883 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016884 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 -060016885 VK_IMAGE_TILING_OPTIMAL, 0);
16886 ASSERT_TRUE(image.initialized());
16887
16888 VkImageView imgView;
16889 VkImageViewCreateInfo imgViewInfo = {};
16890 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16891 imgViewInfo.image = image.handle();
16892 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16893 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16894 imgViewInfo.subresourceRange.layerCount = 1;
16895 imgViewInfo.subresourceRange.baseMipLevel = 0;
16896 imgViewInfo.subresourceRange.levelCount = 1;
16897 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16898
Tony Barbourd6673642016-05-05 14:46:39 -060016899
Tony Barbourd6673642016-05-05 14:46:39 -060016900 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016901 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016902 m_errorMonitor->SetDesiredFailureMsg(
16903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16904 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016905 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16906 m_errorMonitor->VerifyFound();
16907 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16908
Tony Barbourd6673642016-05-05 14:46:39 -060016909 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16910 // VIEW_CREATE_ERROR
16911 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016913 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16914 m_errorMonitor->VerifyFound();
16915 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16916
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016917 // TODO: Update framework to easily passing mutable flag into ImageObj init
16918 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016919 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16920 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16921 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016922 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16923 // VIEW_CREATE_ERROR
16924 VkImageCreateInfo mutImgInfo = image.create_info();
16925 VkImage mutImage;
16926 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016927 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016928 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16929 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016930 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016931 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016932
16933 VkMemoryRequirements requirements;
16934 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16935
16936 VkMemoryAllocateInfo alloc_info{};
16937 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16938 alloc_info.pNext = NULL;
16939 alloc_info.memoryTypeIndex = 0;
16940 alloc_info.allocationSize = requirements.size;
16941 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16942 ASSERT_TRUE(pass);
16943
16944 VkDeviceMemory memory;
16945 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16946 ASSERT_VK_SUCCESS(ret);
16947
16948 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16949 ASSERT_VK_SUCCESS(ret);
16950
Tony Barbourd6673642016-05-05 14:46:39 -060016951 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016953 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16954 m_errorMonitor->VerifyFound();
16955 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016956
16957 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016958 vkDestroyImage(m_device->handle(), mutImage, NULL);
16959}
16960
Petr Kraus4d718682017-05-18 03:38:41 +020016961TEST_F(VkLayerTest, ImageViewSubresourceRangeTests) {
16962 TEST_DESCRIPTION("Passing bad image subrange to CreateImageView");
16963
16964 ASSERT_NO_FATAL_FAILURE(Init());
16965 auto depth_format = FindSupportedDepthStencilFormat(gpu());
16966 if (!depth_format) {
16967 return;
16968 }
16969
16970 VkImageObj image(m_device);
16971 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16972 VK_IMAGE_TILING_OPTIMAL, 0);
16973 ASSERT_TRUE(image.initialized());
16974
16975 VkImageView imgView;
16976 VkImageViewCreateInfo imgViewInfo = {};
16977 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16978 imgViewInfo.image = image.handle();
16979 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16980 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16981 imgViewInfo.subresourceRange.layerCount = 1;
16982 imgViewInfo.subresourceRange.baseMipLevel = 0;
16983 imgViewInfo.subresourceRange.levelCount = 1;
16984 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16985
16986 // View's levelCount can't be 0
16987 imgViewInfo.subresourceRange.levelCount = 0;
16988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16989 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16990 m_errorMonitor->VerifyFound();
16991 imgViewInfo.subresourceRange.levelCount = 1;
16992
16993 // View can't have baseMipLevel >= image's mipLevels
16994 imgViewInfo.subresourceRange.baseMipLevel = 1;
16995 imgViewInfo.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
16996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16997 "vkCreateImageView: pCreateInfo->subresourceRange.baseMipLevel (= 1) is greater or equal "
16998 "to the mip level count of the image (i.e. greater or equal to 1).");
16999 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17000 m_errorMonitor->VerifyFound();
17001 imgViewInfo.subresourceRange.baseMipLevel = 0;
17002 imgViewInfo.subresourceRange.levelCount = 1;
17003
17004 // View can't have baseMipLevel >= image's mipLevels
17005 imgViewInfo.subresourceRange.baseMipLevel = 1;
17006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
17007 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17008 m_errorMonitor->VerifyFound();
17009 imgViewInfo.subresourceRange.baseMipLevel = 0;
17010
17011 // View's baseMipLevel + levelCount can't be > image's mipLevels
17012 imgViewInfo.subresourceRange.levelCount = 2;
17013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
17014 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17015 m_errorMonitor->VerifyFound();
17016 imgViewInfo.subresourceRange.levelCount = 1;
17017
17018 // View's layerCount can't be 0
17019 imgViewInfo.subresourceRange.layerCount = 0;
17020 m_errorMonitor->SetDesiredFailureMsg(
17021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
17022 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
17023 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931); // overlap with param_validation
17024 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17025 m_errorMonitor->VerifyFound();
17026 imgViewInfo.subresourceRange.layerCount = 1;
17027
17028 // View can't have baseArrayLayer >= image's arraySize
17029 imgViewInfo.subresourceRange.baseArrayLayer = 1;
17030 imgViewInfo.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
17031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17032 "vkCreateImageView: pCreateInfo->subresourceRange.baseArrayLayer (= 1) is greater or "
17033 "equal to the arrayLayers of the image when it was created (i.e. greater or equal to 1).");
17034 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17035 m_errorMonitor->VerifyFound();
17036 imgViewInfo.subresourceRange.baseArrayLayer = 0;
17037 imgViewInfo.subresourceRange.layerCount = 1;
17038
17039 // View can't have baseArrayLayer >= image's arraySize
17040 imgViewInfo.subresourceRange.baseArrayLayer = 1;
17041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
17042 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17043 m_errorMonitor->VerifyFound();
17044 imgViewInfo.subresourceRange.baseArrayLayer = 0;
17045
17046 // View's baseArrayLayer + layerCount can't be > image's arrayLayers
17047 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
17048 imgViewInfo.subresourceRange.layerCount = 2;
17049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
17050 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17051 m_errorMonitor->VerifyFound();
17052 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
17053 imgViewInfo.subresourceRange.layerCount = 1;
17054
17055 // View's layerCount of 2D view has to be 1
17056 imgViewInfo.subresourceRange.layerCount = 2;
17057 m_errorMonitor->SetDesiredFailureMsg(
17058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
17059 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
17060 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17061 m_errorMonitor->VerifyFound();
17062 imgViewInfo.subresourceRange.layerCount = 1;
17063
17064 // TODO: should test maitenance1 3D -> 2D array view feature
17065}
17066
Dave Houlton75967fc2017-03-06 17:21:16 -070017067TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
17068 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
17069
Tony Barbour1fa09702017-03-16 12:09:08 -060017070 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070017071
Jamie Madill35127872017-03-15 16:17:46 -040017072 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070017073 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
17074 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
17075 if (device_features.textureCompressionBC) {
17076 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
17077 } else if (device_features.textureCompressionETC2) {
17078 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
17079 } else if (device_features.textureCompressionASTC_LDR) {
17080 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
17081 } else {
17082 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
17083 return;
17084 }
17085
17086 VkImageCreateInfo ci;
17087 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17088 ci.pNext = NULL;
17089 ci.flags = 0;
17090 ci.imageType = VK_IMAGE_TYPE_2D;
17091 ci.format = compressed_format;
17092 ci.extent = {32, 32, 1};
17093 ci.mipLevels = 6;
17094 ci.arrayLayers = 1;
17095 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17096 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17097 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17098 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17099 ci.queueFamilyIndexCount = 0;
17100 ci.pQueueFamilyIndices = NULL;
17101 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17102
17103 VkImageObj image(m_device);
17104 image.init(&ci);
17105 ASSERT_TRUE(image.initialized());
17106
17107 VkImageObj odd_image(m_device);
17108 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
17109 odd_image.init(&ci);
17110 ASSERT_TRUE(odd_image.initialized());
17111
17112 // Allocate buffers
17113 VkMemoryPropertyFlags reqs = 0;
17114 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
17115 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
17116 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
17117 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
17118 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
17119
17120 VkBufferImageCopy region = {};
17121 region.bufferRowLength = 0;
17122 region.bufferImageHeight = 0;
17123 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17124 region.imageSubresource.layerCount = 1;
17125 region.imageOffset = {0, 0, 0};
17126 region.bufferOffset = 0;
17127
17128 // start recording
17129 m_commandBuffer->BeginCommandBuffer();
17130
17131 // Mip level copies that work - 5 levels
17132 m_errorMonitor->ExpectSuccess();
17133
17134 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
17135 region.imageExtent = {32, 32, 1};
17136 region.imageSubresource.mipLevel = 0;
17137 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
17138 &region);
17139 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17140 &region);
17141
17142 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
17143 region.imageExtent = {8, 8, 1};
17144 region.imageSubresource.mipLevel = 2;
17145 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
17146 &region);
17147 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17148 &region);
17149
17150 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
17151 region.imageExtent = {4, 4, 1};
17152 region.imageSubresource.mipLevel = 3;
17153 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17154 &region);
17155 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17156 &region);
17157
17158 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
17159 region.imageExtent = {2, 2, 1};
17160 region.imageSubresource.mipLevel = 4;
17161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17162 &region);
17163 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17164 &region);
17165
17166 region.imageExtent = {1, 1, 1};
17167 region.imageSubresource.mipLevel = 5;
17168 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17169 &region);
17170 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17171 &region);
17172 m_errorMonitor->VerifyNotFound();
17173
17174 // Buffer must accomodate a full compressed block, regardless of texel count
17175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17176 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17177 &region);
17178 m_errorMonitor->VerifyFound();
17179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17180 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17181 &region);
17182 m_errorMonitor->VerifyFound();
17183
17184 // Copy width < compressed block size, but not the full mip width
17185 region.imageExtent = {1, 2, 1};
17186 region.imageSubresource.mipLevel = 4;
17187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17188 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17189 &region);
17190 m_errorMonitor->VerifyFound();
17191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17192 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17193 &region);
17194 m_errorMonitor->VerifyFound();
17195
17196 // Copy height < compressed block size but not the full mip height
17197 region.imageExtent = {2, 1, 1};
17198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17199 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17200 &region);
17201 m_errorMonitor->VerifyFound();
17202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17203 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17204 &region);
17205 m_errorMonitor->VerifyFound();
17206
17207 // Offsets must be multiple of compressed block size
17208 region.imageOffset = {1, 1, 0};
17209 region.imageExtent = {1, 1, 1};
17210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17211 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17212 &region);
17213 m_errorMonitor->VerifyFound();
17214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17215 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17216 &region);
17217 m_errorMonitor->VerifyFound();
17218
17219 // Offset + extent width = mip width - should succeed
17220 region.imageOffset = {4, 4, 0};
17221 region.imageExtent = {3, 4, 1};
17222 region.imageSubresource.mipLevel = 2;
17223 m_errorMonitor->ExpectSuccess();
17224 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17225 &region);
17226 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17227 &region);
17228 m_errorMonitor->VerifyNotFound();
17229
17230 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17231 region.imageExtent = {4, 4, 1};
17232 m_errorMonitor->ExpectSuccess();
17233 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17234 &region);
17235 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17236 &region);
17237 m_errorMonitor->VerifyNotFound();
17238
17239 // Offset + extent width < mip width and not a multiple of block width - should fail
17240 region.imageExtent = {3, 3, 1};
17241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17242 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17243 &region);
17244 m_errorMonitor->VerifyFound();
17245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17246 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17247 &region);
17248 m_errorMonitor->VerifyFound();
17249}
17250
Dave Houlton59a20702017-02-02 17:26:23 -070017251TEST_F(VkLayerTest, ImageBufferCopyTests) {
17252 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17253
Tony Barbour1fa09702017-03-16 12:09:08 -060017254 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017255 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17256 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17257 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17258 return;
17259 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017260
17261 // Bail if any dimension of transfer granularity is 0.
17262 auto index = m_device->graphics_queue_node_index_;
17263 auto queue_family_properties = m_device->phy().queue_properties();
17264 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17265 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17266 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17267 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17268 return;
17269 }
17270
Dave Houlton59a20702017-02-02 17:26:23 -070017271 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17272 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17273 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017274 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17275 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17276 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17277 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17278
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017279 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017280 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17281 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017282 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017283 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17284 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017285 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 -070017286 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017287 ASSERT_TRUE(image_64k.initialized());
17288 ASSERT_TRUE(image_16k.initialized());
17289 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017290
Dave Houltonf3229d52017-02-21 15:59:08 -070017291 // Verify all needed Depth/Stencil formats are supported
17292 bool missing_ds_support = false;
17293 VkFormatProperties props = {0, 0, 0};
17294 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17295 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17296 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17297 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17298 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17299 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17300 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17301 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17302
17303 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017304 ds_image_4D_1S.Init(
17305 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017306 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17307 VK_IMAGE_TILING_OPTIMAL, 0);
17308 ASSERT_TRUE(ds_image_4D_1S.initialized());
17309
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017310 ds_image_3D_1S.Init(
17311 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017312 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17313 VK_IMAGE_TILING_OPTIMAL, 0);
17314 ASSERT_TRUE(ds_image_3D_1S.initialized());
17315
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017316 ds_image_2D.Init(
17317 256, 256, 1, VK_FORMAT_D16_UNORM,
17318 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17319 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017320 ASSERT_TRUE(ds_image_2D.initialized());
17321
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017322 ds_image_1S.Init(
17323 256, 256, 1, VK_FORMAT_S8_UINT,
17324 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17325 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017326 ASSERT_TRUE(ds_image_1S.initialized());
17327 }
17328
17329 // Allocate buffers
17330 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017331 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017332 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17333 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17334 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17335 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017336
17337 VkBufferImageCopy region = {};
17338 region.bufferRowLength = 0;
17339 region.bufferImageHeight = 0;
17340 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17341 region.imageSubresource.layerCount = 1;
17342 region.imageOffset = {0, 0, 0};
17343 region.imageExtent = {64, 64, 1};
17344 region.bufferOffset = 0;
17345
17346 // attempt copies before putting command buffer in recording state
17347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17348 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17349 &region);
17350 m_errorMonitor->VerifyFound();
17351
17352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
17353 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17354 &region);
17355 m_errorMonitor->VerifyFound();
17356
17357 // start recording
17358 m_commandBuffer->BeginCommandBuffer();
17359
17360 // successful copies
17361 m_errorMonitor->ExpectSuccess();
17362 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17363 &region);
17364 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17365 &region);
17366 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17368 &region);
17369 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17370 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17371 &region);
17372 region.imageOffset.x = 0;
17373 region.imageExtent.height = 64;
17374 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17376 &region);
17377 m_errorMonitor->VerifyNotFound();
17378
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017379 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017380 region.imageExtent = {65, 64, 1};
17381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17382 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17383 &region);
17384 m_errorMonitor->VerifyFound();
17385
17386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17387 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17388 &region);
17389 m_errorMonitor->VerifyFound();
17390
17391 // image/buffer too small (offset) on copy to image
17392 region.imageExtent = {64, 64, 1};
17393 region.imageOffset = {0, 4, 0};
17394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17395 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17396 &region);
17397 m_errorMonitor->VerifyFound();
17398
17399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17400 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17401 &region);
17402 m_errorMonitor->VerifyFound();
17403
17404 // image/buffer too small on copy to buffer
17405 region.imageExtent = {64, 64, 1};
17406 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017407 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17409 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17410 &region);
17411 m_errorMonitor->VerifyFound();
17412
17413 region.imageExtent = {64, 65, 1};
17414 region.bufferOffset = 0;
17415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17416 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17417 &region);
17418 m_errorMonitor->VerifyFound();
17419
17420 // buffer size ok but rowlength causes loose packing
17421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17422 region.imageExtent = {64, 64, 1};
17423 region.bufferRowLength = 68;
17424 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17425 &region);
17426 m_errorMonitor->VerifyFound();
17427
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017428 // An extent with zero area should produce a warning, but no error
17429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17430 region.imageExtent.width = 0;
17431 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17432 &region);
17433 m_errorMonitor->VerifyFound();
17434
Dave Houlton59a20702017-02-02 17:26:23 -070017435 // aspect bits
17436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17437 region.imageExtent = {64, 64, 1};
17438 region.bufferRowLength = 0;
17439 region.bufferImageHeight = 0;
17440 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17442 buffer_16k.handle(), 1, &region);
17443 m_errorMonitor->VerifyFound();
17444
17445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17446 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17447 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17448 &region);
17449 m_errorMonitor->VerifyFound();
17450
17451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17452 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17453 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17454 buffer_16k.handle(), 1, &region);
17455 m_errorMonitor->VerifyFound();
17456
Dave Houltonf3229d52017-02-21 15:59:08 -070017457 // Test Depth/Stencil copies
17458 if (missing_ds_support) {
17459 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17460 } else {
17461 VkBufferImageCopy ds_region = {};
17462 ds_region.bufferOffset = 0;
17463 ds_region.bufferRowLength = 0;
17464 ds_region.bufferImageHeight = 0;
17465 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17466 ds_region.imageSubresource.mipLevel = 0;
17467 ds_region.imageSubresource.baseArrayLayer = 0;
17468 ds_region.imageSubresource.layerCount = 1;
17469 ds_region.imageOffset = {0, 0, 0};
17470 ds_region.imageExtent = {256, 256, 1};
17471
17472 // Depth copies that should succeed
17473 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17474 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17475 buffer_256k.handle(), 1, &ds_region);
17476 m_errorMonitor->VerifyNotFound();
17477
17478 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17479 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17480 buffer_256k.handle(), 1, &ds_region);
17481 m_errorMonitor->VerifyNotFound();
17482
17483 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17484 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17485 buffer_128k.handle(), 1, &ds_region);
17486 m_errorMonitor->VerifyNotFound();
17487
17488 // Depth copies that should fail
17489 ds_region.bufferOffset = 4;
17490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17491 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17493 buffer_256k.handle(), 1, &ds_region);
17494 m_errorMonitor->VerifyFound();
17495
17496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17497 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17498 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17499 buffer_256k.handle(), 1, &ds_region);
17500 m_errorMonitor->VerifyFound();
17501
17502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17503 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17504 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17505 buffer_128k.handle(), 1, &ds_region);
17506 m_errorMonitor->VerifyFound();
17507
17508 // Stencil copies that should succeed
17509 ds_region.bufferOffset = 0;
17510 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17511 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17512 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17513 buffer_64k.handle(), 1, &ds_region);
17514 m_errorMonitor->VerifyNotFound();
17515
17516 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17517 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17518 buffer_64k.handle(), 1, &ds_region);
17519 m_errorMonitor->VerifyNotFound();
17520
17521 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17522 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17523 buffer_64k.handle(), 1, &ds_region);
17524 m_errorMonitor->VerifyNotFound();
17525
17526 // Stencil copies that should fail
17527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17528 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17529 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17530 buffer_16k.handle(), 1, &ds_region);
17531 m_errorMonitor->VerifyFound();
17532
17533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17534 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17535 ds_region.bufferRowLength = 260;
17536 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17537 buffer_64k.handle(), 1, &ds_region);
17538 m_errorMonitor->VerifyFound();
17539
17540 ds_region.bufferRowLength = 0;
17541 ds_region.bufferOffset = 4;
17542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17543 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17544 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17545 buffer_64k.handle(), 1, &ds_region);
17546 m_errorMonitor->VerifyFound();
17547 }
17548
Dave Houlton584d51e2017-02-16 12:52:54 -070017549 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017550 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017551 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017552 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17553 device_features.textureCompressionASTC_LDR)) {
17554 printf(" No compressed formats supported - block compression tests skipped.\n");
17555 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017556 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17557 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017558 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017559 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17560 0);
17561 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 -070017562 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017563 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017564 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 -070017565 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017566 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 -070017567 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017568 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017569 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 -070017570 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017571 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 -070017572 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017573 }
17574 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017575
Dave Houlton584d51e2017-02-16 12:52:54 -070017576 // Just fits
17577 m_errorMonitor->ExpectSuccess();
17578 region.imageExtent = {128, 128, 1};
17579 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17580 buffer_16k.handle(), 1, &region);
17581 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017582
Dave Houlton584d51e2017-02-16 12:52:54 -070017583 // with offset, too big for buffer
17584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17585 region.bufferOffset = 16;
17586 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17587 buffer_16k.handle(), 1, &region);
17588 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017589 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017590
Dave Houlton67e9b532017-03-02 17:00:10 -070017591 // extents that are not a multiple of compressed block size
17592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17593 region.imageExtent.width = 66;
17594 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17595 buffer_16k.handle(), 1, &region);
17596 m_errorMonitor->VerifyFound();
17597 region.imageExtent.width = 128;
17598
17599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017600 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017601 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17602 buffer_16k.handle(), 1, &region);
17603 m_errorMonitor->VerifyFound();
17604 region.imageExtent.height = 128;
17605
17606 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17607
17608 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17609 m_errorMonitor->ExpectSuccess();
17610 region.imageExtent.width = 66;
17611 region.imageOffset.x = 64;
17612 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17613 buffer_16k.handle(), 1, &region);
17614 region.imageExtent.width = 16;
17615 region.imageOffset.x = 0;
17616 region.imageExtent.height = 2;
17617 region.imageOffset.y = 128;
17618 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017619 buffer_16k.handle(), 1, &region);
17620 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017621 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017622
Dave Houlton584d51e2017-02-16 12:52:54 -070017623 // buffer offset must be a multiple of texel block size (16)
17624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17626 region.imageExtent = {64, 64, 1};
17627 region.bufferOffset = 24;
17628 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17629 buffer_16k.handle(), 1, &region);
17630 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017631
Dave Houlton584d51e2017-02-16 12:52:54 -070017632 // rowlength not a multiple of block width (4)
17633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17634 region.bufferOffset = 0;
17635 region.bufferRowLength = 130;
17636 region.bufferImageHeight = 0;
17637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17638 buffer_64k.handle(), 1, &region);
17639 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017640
Dave Houlton584d51e2017-02-16 12:52:54 -070017641 // imageheight not a multiple of block height (4)
17642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17643 region.bufferRowLength = 0;
17644 region.bufferImageHeight = 130;
17645 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17646 buffer_64k.handle(), 1, &region);
17647 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017648 }
Dave Houlton59a20702017-02-02 17:26:23 -070017649}
17650
Tony Barbourd6673642016-05-05 14:46:39 -060017651TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017652 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017653
Tony Barbour1fa09702017-03-16 12:09:08 -060017654 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017655
Rene Lindsay135204f2016-12-22 17:11:09 -070017656 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017657 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017658 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 -070017659 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017660 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017661 vk_testing::Buffer buffer;
17662 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017663 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017664 VkBufferImageCopy region = {};
17665 region.bufferRowLength = 128;
17666 region.bufferImageHeight = 128;
17667 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17668 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017669 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017670 region.imageExtent.height = 4;
17671 region.imageExtent.width = 4;
17672 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017673
17674 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017675 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 -070017676 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017677 ASSERT_TRUE(image2.initialized());
17678 vk_testing::Buffer buffer2;
17679 VkMemoryPropertyFlags reqs2 = 0;
17680 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17681 VkBufferImageCopy region2 = {};
17682 region2.bufferRowLength = 128;
17683 region2.bufferImageHeight = 128;
17684 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17685 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17686 region2.imageSubresource.layerCount = 1;
17687 region2.imageExtent.height = 4;
17688 region2.imageExtent.width = 4;
17689 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017690 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017691
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017692 // Image must have offset.z of 0 and extent.depth of 1
17693 // Introduce failure by setting imageExtent.depth to 0
17694 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017696 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017697 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017698 m_errorMonitor->VerifyFound();
17699
17700 region.imageExtent.depth = 1;
17701
17702 // Image must have offset.z of 0 and extent.depth of 1
17703 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017704 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017705 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017708 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017709 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017710 m_errorMonitor->VerifyFound();
17711
17712 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017713 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17714 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017715 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017717 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17718 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017719 m_errorMonitor->VerifyFound();
17720
17721 // BufferOffset must be a multiple of 4
17722 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017723 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017725 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017727 m_errorMonitor->VerifyFound();
17728
17729 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17730 region.bufferOffset = 0;
17731 region.imageExtent.height = 128;
17732 region.imageExtent.width = 128;
17733 // Introduce failure by setting bufferRowLength > 0 but less than width
17734 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017736 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17737 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017738 m_errorMonitor->VerifyFound();
17739
17740 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17741 region.bufferRowLength = 128;
17742 // Introduce failure by setting bufferRowHeight > 0 but less than height
17743 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017745 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17746 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017747 m_errorMonitor->VerifyFound();
17748
17749 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017750 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017751 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 -070017752 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017753 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017754 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 -070017755 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017756 VkImageBlit blitRegion = {};
17757 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17758 blitRegion.srcSubresource.baseArrayLayer = 0;
17759 blitRegion.srcSubresource.layerCount = 1;
17760 blitRegion.srcSubresource.mipLevel = 0;
17761 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17762 blitRegion.dstSubresource.baseArrayLayer = 0;
17763 blitRegion.dstSubresource.layerCount = 1;
17764 blitRegion.dstSubresource.mipLevel = 0;
17765
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017766 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17768 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17770 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017771 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17772 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017773 m_errorMonitor->VerifyFound();
17774
Petr Kraus4d718682017-05-18 03:38:41 +020017775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02931);
Tony Barbourd6673642016-05-05 14:46:39 -060017776 VkImageMemoryBarrier img_barrier;
17777 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17778 img_barrier.pNext = NULL;
17779 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17780 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17781 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17782 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17783 img_barrier.image = image.handle();
17784 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17785 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17786 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17787 img_barrier.subresourceRange.baseArrayLayer = 0;
17788 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017789 img_barrier.subresourceRange.layerCount = 0;
17790 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017791 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17792 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017793 m_errorMonitor->VerifyFound();
17794 img_barrier.subresourceRange.layerCount = 1;
17795}
17796
17797TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017798 TEST_DESCRIPTION("Exceed the limits of image format ");
17799
Tony Barbour1fa09702017-03-16 12:09:08 -060017800 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017801
17802 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17803 {
17804 VkFormatProperties properties;
17805 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17806 if (properties.linearTilingFeatures == 0) {
17807 printf(" Image format not supported; skipped.\n");
17808 return;
17809 }
17810 }
17811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017813 VkImageCreateInfo image_create_info = {};
17814 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17815 image_create_info.pNext = NULL;
17816 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017817 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017818 image_create_info.extent.width = 32;
17819 image_create_info.extent.height = 32;
17820 image_create_info.extent.depth = 1;
17821 image_create_info.mipLevels = 1;
17822 image_create_info.arrayLayers = 1;
17823 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17824 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17825 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17826 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17827 image_create_info.flags = 0;
17828
17829 VkImage nullImg;
17830 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017831 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17832 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017833 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017834 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17835 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17836 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017837 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017838
Tony Barbour0907e362017-03-09 15:05:30 -070017839 uint32_t maxDim =
17840 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17841 // If max mip levels exceeds image extents, skip the max mip levels test
17842 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17844 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17845 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17846 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17847 m_errorMonitor->VerifyFound();
17848 image_create_info.mipLevels = 1;
17849 }
Tony Barbourd6673642016-05-05 14:46:39 -060017850
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017852 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17853 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17854 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17855 m_errorMonitor->VerifyFound();
17856 image_create_info.arrayLayers = 1;
17857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017859 int samples = imgFmtProps.sampleCounts >> 1;
17860 image_create_info.samples = (VkSampleCountFlagBits)samples;
17861 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17862 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17863 m_errorMonitor->VerifyFound();
17864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17865
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17867 "pCreateInfo->initialLayout, must be "
17868 "VK_IMAGE_LAYOUT_UNDEFINED or "
17869 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017870 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17871 // Expect INVALID_LAYOUT
17872 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17873 m_errorMonitor->VerifyFound();
17874 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17875}
17876
Dave Houltona7df3782017-05-09 18:00:46 -060017877TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
17878 // Image copy tests where format type and extents don't match
17879
17880 // Include maintenance1 extension if available
17881 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
17882 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
17883
17884 // See if maintenance1 extension is available and enabled.
17885 uint32_t extension_count = 0;
17886 bool supports_maintenance1_extension = false;
17887 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
17888 ASSERT_VK_SUCCESS(err);
17889 if (extension_count > 0) {
17890 std::vector<VkExtensionProperties> available_extensions(extension_count);
17891
17892 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
17893 ASSERT_VK_SUCCESS(err);
17894 for (const auto &extension_props : available_extensions) {
17895 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
17896 supports_maintenance1_extension = true;
17897 }
17898 }
17899 }
17900
17901 ASSERT_NO_FATAL_FAILURE(InitState());
17902
17903 VkImageCreateInfo ci;
17904 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17905 ci.pNext = NULL;
17906 ci.flags = 0;
17907 ci.imageType = VK_IMAGE_TYPE_1D;
17908 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17909 ci.extent = {32, 1, 1};
17910 ci.mipLevels = 1;
17911 ci.arrayLayers = 1;
17912 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17913 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17914 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17915 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17916 ci.queueFamilyIndexCount = 0;
17917 ci.pQueueFamilyIndices = NULL;
17918 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17919
17920 // Create 1D image
17921 VkImageObj image_1D(m_device);
17922 image_1D.init(&ci);
17923 ASSERT_TRUE(image_1D.initialized());
17924
17925 // 2D image
17926 ci.imageType = VK_IMAGE_TYPE_2D;
17927 ci.extent = {32, 32, 1};
17928 VkImageObj image_2D(m_device);
17929 image_2D.init(&ci);
17930 ASSERT_TRUE(image_2D.initialized());
17931
17932 // 3D image
17933 ci.imageType = VK_IMAGE_TYPE_3D;
17934 ci.extent = {32, 32, 8};
17935 VkImageObj image_3D(m_device);
17936 image_3D.init(&ci);
17937 ASSERT_TRUE(image_3D.initialized());
17938
17939 // 2D image array
17940 ci.imageType = VK_IMAGE_TYPE_2D;
17941 ci.extent = {32, 32, 1};
17942 ci.arrayLayers = 8;
17943 VkImageObj image_2D_array(m_device);
17944 image_2D_array.init(&ci);
17945 ASSERT_TRUE(image_2D_array.initialized());
17946
17947 m_commandBuffer->BeginCommandBuffer();
17948
17949 VkImageCopy copy_region;
17950 copy_region.extent = {32, 1, 1};
17951 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17952 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17953 copy_region.srcSubresource.mipLevel = 0;
17954 copy_region.dstSubresource.mipLevel = 0;
17955 copy_region.srcSubresource.baseArrayLayer = 0;
17956 copy_region.dstSubresource.baseArrayLayer = 0;
17957 copy_region.srcSubresource.layerCount = 1;
17958 copy_region.dstSubresource.layerCount = 1;
17959 copy_region.srcOffset = {0, 0, 0};
17960 copy_region.dstOffset = {0, 0, 0};
17961
17962 // Sanity check
17963 m_errorMonitor->ExpectSuccess();
17964 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17965 &copy_region);
17966 m_errorMonitor->VerifyNotFound();
17967
17968 // 1D texture w/ offset.y > 0. Source = VU 01742, dest = 01744
17969 copy_region.srcOffset.y = 1;
17970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01742);
17971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203); // also y-dim overrun
17972 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17973 &copy_region);
17974 m_errorMonitor->VerifyFound();
17975 copy_region.srcOffset.y = 0;
17976 copy_region.dstOffset.y = 1;
17977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01744);
17978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206); // also y-dim overrun
17979 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17980 &copy_region);
17981 m_errorMonitor->VerifyFound();
17982 copy_region.dstOffset.y = 0;
17983
17984 // 1D texture w/ extent.height > 1. Source = VU 01742, dest = 01744
17985 copy_region.extent.height = 2;
17986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01742);
17987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203); // also y-dim overrun
17988 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17989 &copy_region);
17990 m_errorMonitor->VerifyFound();
17991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01744);
17992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206); // also y-dim overrun
17993 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17994 &copy_region);
17995 m_errorMonitor->VerifyFound();
17996 copy_region.extent.height = 1;
17997
17998 // 2D texture w/ offset.z > 0. Source = VU 01743, dest = 01745
17999 copy_region.extent = {16, 16, 1};
18000 copy_region.srcOffset.z = 4;
18001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01743);
18002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204); // also z-dim overrun
18003 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18004 &copy_region);
18005 m_errorMonitor->VerifyFound();
18006 copy_region.srcOffset.z = 0;
18007 copy_region.dstOffset.z = 1;
18008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01745);
18009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207); // also z-dim overrun
18010 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18011 &copy_region);
18012 m_errorMonitor->VerifyFound();
18013 copy_region.dstOffset.z = 0;
18014
18015 // 2D texture w/ extent.depth > 1. Source = VU 01743, dest = 01745
18016 copy_region.extent.depth = 8;
18017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01743);
18018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204); // also z-dim overrun
18019 if (supports_maintenance1_extension) { // With maintenance1, will also report a depth slice mismatch
18020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
18021 }
18022 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18023 &copy_region);
18024 m_errorMonitor->VerifyFound();
18025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01745);
18026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207); // also z-dim overrun
18027 if (supports_maintenance1_extension) { // With maintenance1, will also report a depth slice mismatch
18028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
18029 }
18030 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18031 &copy_region);
18032 m_errorMonitor->VerifyFound();
18033 copy_region.extent.depth = 1;
18034
18035 // 3D texture accessing an array layer other than 0. VU 01199
18036 copy_region.extent = {4, 4, 1};
18037 copy_region.srcSubresource.baseArrayLayer = 1;
18038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01199);
18039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01224); // also triggers 'too many layers'
18040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18041 VALIDATION_ERROR_02603); // and 'copy from layer not present'
18042 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18043 &copy_region);
18044 m_errorMonitor->VerifyFound();
18045
18046 if (supports_maintenance1_extension) {
18047 // Copy from layer not present - VU02603
18048 // TODO: this VU is redundant with VU01224. Gitlab issue 812 submitted to have it removed.
18049 copy_region.srcSubresource.baseArrayLayer = 4;
18050 copy_region.srcSubresource.layerCount = 6;
18051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02603);
18052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01224);
18053 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18054 &copy_region);
18055 m_errorMonitor->VerifyFound();
18056 copy_region.srcSubresource.baseArrayLayer = 0;
18057 copy_region.srcSubresource.layerCount = 1;
18058
18059 // Copy to layer not present - VU02604
18060 // TODO: this VU is redundant with VU01224. Gitlab issue 812 submitted to have it removed.
18061 copy_region.dstSubresource.baseArrayLayer = 1;
18062 copy_region.dstSubresource.layerCount = 8;
18063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02604);
18064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01224);
18065 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18066 &copy_region);
18067 m_errorMonitor->VerifyFound();
18068 copy_region.dstSubresource.layerCount = 1;
18069 }
18070 m_commandBuffer->EndCommandBuffer();
18071}
18072
18073TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
18074 // Image copy tests on compressed images with block alignment errors
18075
18076 ASSERT_NO_FATAL_FAILURE(Init());
18077
18078 // Select a compressed format and verify support
18079 VkPhysicalDeviceFeatures device_features = {};
18080 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
18081 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
18082 if (device_features.textureCompressionBC) {
18083 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
18084 } else if (device_features.textureCompressionETC2) {
18085 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
18086 } else if (device_features.textureCompressionASTC_LDR) {
18087 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
18088 }
18089
18090 VkImageCreateInfo ci;
18091 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18092 ci.pNext = NULL;
18093 ci.flags = 0;
18094 ci.imageType = VK_IMAGE_TYPE_2D;
18095 ci.format = compressed_format;
18096 ci.extent = {64, 64, 1};
18097 ci.mipLevels = 1;
18098 ci.arrayLayers = 1;
18099 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18100 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18101 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18102 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18103 ci.queueFamilyIndexCount = 0;
18104 ci.pQueueFamilyIndices = NULL;
18105 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18106
18107 VkImageFormatProperties img_prop = {};
18108 if (VK_SUCCESS != vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
18109 ci.usage, ci.flags, &img_prop)) {
18110 printf(" No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n");
18111 return;
18112 }
18113
18114 // Create images
18115 VkImageObj image_1(m_device);
18116 image_1.init(&ci);
18117 ASSERT_TRUE(image_1.initialized());
18118
18119 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
18120 VkImageObj image_2(m_device);
18121 image_2.init(&ci);
18122 ASSERT_TRUE(image_2.initialized());
18123
18124 m_commandBuffer->BeginCommandBuffer();
18125
18126 VkImageCopy copy_region;
18127 copy_region.extent = {48, 48, 1};
18128 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18129 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18130 copy_region.srcSubresource.mipLevel = 0;
18131 copy_region.dstSubresource.mipLevel = 0;
18132 copy_region.srcSubresource.baseArrayLayer = 0;
18133 copy_region.dstSubresource.baseArrayLayer = 0;
18134 copy_region.srcSubresource.layerCount = 1;
18135 copy_region.dstSubresource.layerCount = 1;
18136 copy_region.srcOffset = {0, 0, 0};
18137 copy_region.dstOffset = {0, 0, 0};
18138
18139 // Sanity check
18140 m_errorMonitor->ExpectSuccess();
18141 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18142 m_errorMonitor->VerifyNotFound();
18143
18144 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
18145 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
18146 copy_region.srcOffset = {2, 4, 0}; // source width
18147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01209);
18148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18149 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18150 m_errorMonitor->VerifyFound();
18151 copy_region.srcOffset = {12, 1, 0}; // source height
18152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01209);
18153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18154 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18155 m_errorMonitor->VerifyFound();
18156 copy_region.srcOffset = {0, 0, 0};
18157 copy_region.dstOffset = {1, 0, 0}; // dest width
18158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01214);
18159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18160 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18161 m_errorMonitor->VerifyFound();
18162 copy_region.dstOffset = {4, 1, 0}; // dest height
18163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01214);
18164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18165 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18166 m_errorMonitor->VerifyFound();
18167 copy_region.dstOffset = {0, 0, 0};
18168
18169 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
18170 copy_region.extent = {62, 60, 1}; // source width
18171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01210);
18172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18173 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18174 m_errorMonitor->VerifyFound();
18175 copy_region.extent = {60, 62, 1}; // source height
18176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01211);
18177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18178 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18179 m_errorMonitor->VerifyFound();
18180 copy_region.extent = {62, 60, 1}; // dest width
18181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01215);
18182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18183 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18184 m_errorMonitor->VerifyFound();
18185 copy_region.extent = {60, 62, 1}; // dest height
18186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01216);
18187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
18188 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
18189 m_errorMonitor->VerifyFound();
18190
18191 // Note: VALIDATION_ERROR_01212 and VALIDATION_ERROR_01217
18192 // VUs 01212 and 01217 should be tested here, if possible. There are currently no supported compressed formats with
18193 // a block depth other than 1, so impossible to create a 'not a multiple' condiditon for depth.
18194
18195 m_commandBuffer->EndCommandBuffer();
18196}
18197
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018198TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018199 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060018200 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018201
Dave Houltonfc1a4052017-04-27 14:32:45 -060018202 // Create images with full mip chain
18203 VkImageCreateInfo ci;
18204 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18205 ci.pNext = NULL;
18206 ci.flags = 0;
18207 ci.imageType = VK_IMAGE_TYPE_3D;
18208 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18209 ci.extent = {32, 32, 8};
18210 ci.mipLevels = 6;
18211 ci.arrayLayers = 1;
18212 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18213 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18214 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18215 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18216 ci.queueFamilyIndexCount = 0;
18217 ci.pQueueFamilyIndices = NULL;
18218 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18219
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018220 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060018221 src_image.init(&ci);
18222 ASSERT_TRUE(src_image.initialized());
18223
18224 // Dest image with one more mip level
18225 ci.extent = {64, 64, 16};
18226 ci.mipLevels = 7;
18227 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018228 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060018229 dst_image.init(&ci);
18230 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018231
Tony Barbour552f6c02016-12-21 14:34:07 -070018232 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060018233
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018234 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018235 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018236 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018237 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060018238 copy_region.srcSubresource.mipLevel = 0;
18239 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018240 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018241 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018242 copy_region.srcSubresource.layerCount = 1;
18243 copy_region.dstSubresource.layerCount = 1;
18244 copy_region.srcOffset = {0, 0, 0};
18245 copy_region.dstOffset = {0, 0, 0};
18246
18247 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018248 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18249 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060018250 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018251
Dave Houltonfc1a4052017-04-27 14:32:45 -060018252 // Source exceeded in x-dim, VU 01202
18253 copy_region.srcOffset.x = 4;
18254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
18255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
18256 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18257 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018258 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060018259
18260 // Source exceeded in y-dim, VU 01203
18261 copy_region.srcOffset.x = 0;
18262 copy_region.extent.height = 48;
18263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
18264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
18265 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18266 &copy_region);
18267 m_errorMonitor->VerifyFound();
18268
18269 // Source exceeded in z-dim, VU 01204
18270 copy_region.extent = {4, 4, 4};
18271 copy_region.srcSubresource.mipLevel = 2;
18272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
18273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
18274 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18275 &copy_region);
18276 m_errorMonitor->VerifyFound();
18277
18278 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018279}
18280
18281TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018282 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060018283 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018284
Dave Houltonfc1a4052017-04-27 14:32:45 -060018285 // Create images with full mip chain
18286 VkImageCreateInfo ci;
18287 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18288 ci.pNext = NULL;
18289 ci.flags = 0;
18290 ci.imageType = VK_IMAGE_TYPE_3D;
18291 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18292 ci.extent = {32, 32, 8};
18293 ci.mipLevels = 6;
18294 ci.arrayLayers = 1;
18295 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18296 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18297 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18298 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18299 ci.queueFamilyIndexCount = 0;
18300 ci.pQueueFamilyIndices = NULL;
18301 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18302
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018303 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060018304 dst_image.init(&ci);
18305 ASSERT_TRUE(dst_image.initialized());
18306
18307 // Src image with one more mip level
18308 ci.extent = {64, 64, 16};
18309 ci.mipLevels = 7;
18310 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18311 VkImageObj src_image(m_device);
18312 src_image.init(&ci);
18313 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018314
Tony Barbour552f6c02016-12-21 14:34:07 -070018315 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060018316
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018317 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018318 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018319 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018320 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060018321 copy_region.srcSubresource.mipLevel = 0;
18322 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018323 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018324 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060018325 copy_region.srcSubresource.layerCount = 1;
18326 copy_region.dstSubresource.layerCount = 1;
18327 copy_region.srcOffset = {0, 0, 0};
18328 copy_region.dstOffset = {0, 0, 0};
18329
18330 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018331 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18332 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060018333 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018334
Dave Houltonfc1a4052017-04-27 14:32:45 -060018335 // Dest exceeded in x-dim, VU 01205
18336 copy_region.dstOffset.x = 4;
18337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
18338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
18339 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18340 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018341 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060018342
18343 // Dest exceeded in y-dim, VU 01206
18344 copy_region.dstOffset.x = 0;
18345 copy_region.extent.height = 48;
18346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
18347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
18348 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18349 &copy_region);
18350 m_errorMonitor->VerifyFound();
18351
18352 // Dest exceeded in z-dim, VU 01207
18353 copy_region.extent = {4, 4, 4};
18354 copy_region.dstSubresource.mipLevel = 2;
18355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
18356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
18357 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18358 &copy_region);
18359 m_errorMonitor->VerifyFound();
18360
18361 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018362}
18363
Karl Schultz6addd812016-02-02 17:17:23 -070018364TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060018365 VkResult err;
18366 bool pass;
18367
18368 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070018369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060018370
Tony Barbour1fa09702017-03-16 12:09:08 -060018371 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060018372
18373 // Create two images of different types and try to copy between them
18374 VkImage srcImage;
18375 VkImage dstImage;
18376 VkDeviceMemory srcMem;
18377 VkDeviceMemory destMem;
18378 VkMemoryRequirements memReqs;
18379
18380 VkImageCreateInfo image_create_info = {};
18381 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18382 image_create_info.pNext = NULL;
18383 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18384 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18385 image_create_info.extent.width = 32;
18386 image_create_info.extent.height = 32;
18387 image_create_info.extent.depth = 1;
18388 image_create_info.mipLevels = 1;
18389 image_create_info.arrayLayers = 1;
18390 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18391 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18392 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18393 image_create_info.flags = 0;
18394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018395 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018396 ASSERT_VK_SUCCESS(err);
18397
18398 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18399 // Introduce failure by creating second image with a different-sized format.
18400 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018401 VkFormatProperties properties;
18402 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18403 if (properties.optimalTilingFeatures == 0) {
Tobin Ehliscc980e12017-05-19 12:05:49 -060018404 vkDestroyImage(m_device->device(), srcImage, NULL);
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018405 printf(" Image format not supported; skipped.\n");
18406 return;
18407 }
Karl Schultzbdb75952016-04-19 11:36:49 -060018408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018409 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018410 ASSERT_VK_SUCCESS(err);
18411
18412 // Allocate memory
18413 VkMemoryAllocateInfo memAlloc = {};
18414 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18415 memAlloc.pNext = NULL;
18416 memAlloc.allocationSize = 0;
18417 memAlloc.memoryTypeIndex = 0;
18418
18419 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
18420 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018421 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018422 ASSERT_TRUE(pass);
18423 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
18424 ASSERT_VK_SUCCESS(err);
18425
18426 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
18427 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018428 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018429 ASSERT_TRUE(pass);
18430 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
18431 ASSERT_VK_SUCCESS(err);
18432
18433 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18434 ASSERT_VK_SUCCESS(err);
18435 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
18436 ASSERT_VK_SUCCESS(err);
18437
Tony Barbour552f6c02016-12-21 14:34:07 -070018438 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018439 VkImageCopy copyRegion;
18440 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18441 copyRegion.srcSubresource.mipLevel = 0;
18442 copyRegion.srcSubresource.baseArrayLayer = 0;
18443 copyRegion.srcSubresource.layerCount = 0;
18444 copyRegion.srcOffset.x = 0;
18445 copyRegion.srcOffset.y = 0;
18446 copyRegion.srcOffset.z = 0;
18447 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18448 copyRegion.dstSubresource.mipLevel = 0;
18449 copyRegion.dstSubresource.baseArrayLayer = 0;
18450 copyRegion.dstSubresource.layerCount = 0;
18451 copyRegion.dstOffset.x = 0;
18452 copyRegion.dstOffset.y = 0;
18453 copyRegion.dstOffset.z = 0;
18454 copyRegion.extent.width = 1;
18455 copyRegion.extent.height = 1;
18456 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018457 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018458 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018459
18460 m_errorMonitor->VerifyFound();
18461
18462 vkDestroyImage(m_device->device(), srcImage, NULL);
18463 vkDestroyImage(m_device->device(), dstImage, NULL);
18464 vkFreeMemory(m_device->device(), srcMem, NULL);
18465 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018466}
18467
Karl Schultz6addd812016-02-02 17:17:23 -070018468TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18469 VkResult err;
18470 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018471
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018472 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18474 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018475
Tony Barbour1fa09702017-03-16 12:09:08 -060018476 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018477 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018478 if (!depth_format) {
18479 return;
18480 }
Mike Stroyana3082432015-09-25 13:39:21 -060018481
18482 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018483 VkImage srcImage;
18484 VkImage dstImage;
18485 VkDeviceMemory srcMem;
18486 VkDeviceMemory destMem;
18487 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018488
18489 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018490 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18491 image_create_info.pNext = NULL;
18492 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018493 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018494 image_create_info.extent.width = 32;
18495 image_create_info.extent.height = 32;
18496 image_create_info.extent.depth = 1;
18497 image_create_info.mipLevels = 1;
18498 image_create_info.arrayLayers = 1;
18499 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018500 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018501 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18502 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018503 VkFormatProperties properties;
18504 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18505 if (properties.optimalTilingFeatures == 0) {
18506 printf(" Image format not supported; skipped.\n");
18507 return;
18508 }
Mike Stroyana3082432015-09-25 13:39:21 -060018509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018510 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018511 ASSERT_VK_SUCCESS(err);
18512
Karl Schultzbdb75952016-04-19 11:36:49 -060018513 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18514
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018515 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018516 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018517 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018518 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018519
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018520 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018521 ASSERT_VK_SUCCESS(err);
18522
18523 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018524 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018525 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18526 memAlloc.pNext = NULL;
18527 memAlloc.allocationSize = 0;
18528 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018529
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018530 vkGetImageMemoryRequirements(m_device->device(), srcImage, &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, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018535 ASSERT_VK_SUCCESS(err);
18536
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018537 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018538 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018539 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018540 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018541 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018542 ASSERT_VK_SUCCESS(err);
18543
18544 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18545 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018546 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018547 ASSERT_VK_SUCCESS(err);
18548
Tony Barbour552f6c02016-12-21 14:34:07 -070018549 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018550 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018551 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018552 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018553 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018554 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018555 copyRegion.srcOffset.x = 0;
18556 copyRegion.srcOffset.y = 0;
18557 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018558 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018559 copyRegion.dstSubresource.mipLevel = 0;
18560 copyRegion.dstSubresource.baseArrayLayer = 0;
18561 copyRegion.dstSubresource.layerCount = 0;
18562 copyRegion.dstOffset.x = 0;
18563 copyRegion.dstOffset.y = 0;
18564 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018565 copyRegion.extent.width = 1;
18566 copyRegion.extent.height = 1;
18567 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018568 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018569 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018570
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018571 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018572
Chia-I Wuf7458c52015-10-26 21:10:41 +080018573 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018574 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018575 vkFreeMemory(m_device->device(), srcMem, NULL);
18576 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018577}
18578
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018579TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18580 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018581
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018582 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018583
18584 VkImageFormatProperties image_format_properties;
18585 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18586 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18587 &image_format_properties);
18588
18589 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18590 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18591 printf(" Image multi-sample support not found; skipped.\n");
18592 return;
18593 }
18594
18595 VkImageCreateInfo ci;
18596 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18597 ci.pNext = NULL;
18598 ci.flags = 0;
18599 ci.imageType = VK_IMAGE_TYPE_2D;
18600 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18601 ci.extent = {128, 128, 1};
18602 ci.mipLevels = 1;
18603 ci.arrayLayers = 1;
18604 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18605 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18606 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18607 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18608 ci.queueFamilyIndexCount = 0;
18609 ci.pQueueFamilyIndices = NULL;
18610 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18611
18612 VkImageObj image1(m_device);
18613 image1.init(&ci);
18614 ASSERT_TRUE(image1.initialized());
18615
18616 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18617 VkImageObj image2(m_device);
18618 image2.init(&ci);
18619 ASSERT_TRUE(image2.initialized());
18620
18621 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18622 VkImageObj image4(m_device);
18623 image4.init(&ci);
18624 ASSERT_TRUE(image4.initialized());
18625
18626 m_commandBuffer->BeginCommandBuffer();
18627
18628 VkImageCopy copyRegion;
18629 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18630 copyRegion.srcSubresource.mipLevel = 0;
18631 copyRegion.srcSubresource.baseArrayLayer = 0;
18632 copyRegion.srcSubresource.layerCount = 1;
18633 copyRegion.srcOffset = {0, 0, 0};
18634 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18635 copyRegion.dstSubresource.mipLevel = 0;
18636 copyRegion.dstSubresource.baseArrayLayer = 0;
18637 copyRegion.dstSubresource.layerCount = 1;
18638 copyRegion.dstOffset = {0, 0, 0};
18639 copyRegion.extent = {128, 128, 1};
18640
18641 // Copy a single sample image to/from a multi-sample image
18642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18643 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18644 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18645 m_errorMonitor->VerifyFound();
18646
18647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18648 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18649 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18650 m_errorMonitor->VerifyFound();
18651
18652 // Copy between multi-sample images with different sample counts
18653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18654 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18655 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18656 m_errorMonitor->VerifyFound();
18657
18658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18659 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18660 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18661 m_errorMonitor->VerifyFound();
18662
18663 m_commandBuffer->EndCommandBuffer();
18664}
18665
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018666TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18667 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018668 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018669 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018670 if (!ds_format) {
18671 return;
18672 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018673
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018674 VkFormatProperties properties;
18675 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18676 if (properties.optimalTilingFeatures == 0) {
18677 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18678 return;
18679 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018680 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018681 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 -060018682 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 -060018683 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018684 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18685 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018686 ASSERT_TRUE(color_image.initialized());
18687 ASSERT_TRUE(depth_image.initialized());
18688 ASSERT_TRUE(ds_image.initialized());
18689
18690 VkImageCopy copyRegion;
18691 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18692 copyRegion.srcSubresource.mipLevel = 0;
18693 copyRegion.srcSubresource.baseArrayLayer = 0;
18694 copyRegion.srcSubresource.layerCount = 1;
18695 copyRegion.srcOffset = {0, 0, 0};
18696 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18697 copyRegion.dstSubresource.mipLevel = 0;
18698 copyRegion.dstSubresource.baseArrayLayer = 0;
18699 copyRegion.dstSubresource.layerCount = 1;
18700 copyRegion.dstOffset = {64, 0, 0};
18701 copyRegion.extent = {64, 128, 1};
18702
18703 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18705 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18706 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18707 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018708 m_errorMonitor->VerifyFound();
18709
18710 m_commandBuffer->BeginCommandBuffer();
18711
18712 // Src and dest aspect masks don't match
18713 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018715 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18716 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018717 m_errorMonitor->VerifyFound();
18718 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18719
18720 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018721 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018722 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18724 // These aspect/format mismatches are redundant but unavoidable here
18725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018727 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18728 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018729 m_errorMonitor->VerifyFound();
18730 // Metadata aspect is illegal - VU 01222
18731 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18732 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18734 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018735 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18736 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018737 m_errorMonitor->VerifyFound();
18738
18739 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18740 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18741
18742 // Aspect mask doesn't match source image format - VU 01200
18743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18744 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18746 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18747 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18748 m_errorMonitor->VerifyFound();
18749
18750 // Aspect mask doesn't match dest image format - VU 01201
18751 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18752 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18754 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18756 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18757 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18758 m_errorMonitor->VerifyFound();
18759
18760 m_commandBuffer->EndCommandBuffer();
18761}
18762
Karl Schultz6addd812016-02-02 17:17:23 -070018763TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18764 VkResult err;
18765 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018766
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18768 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018769
Tony Barbour1fa09702017-03-16 12:09:08 -060018770 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018771
18772 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018773 VkImage srcImage;
18774 VkImage dstImage;
18775 VkDeviceMemory srcMem;
18776 VkDeviceMemory destMem;
18777 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018778
18779 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018780 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18781 image_create_info.pNext = NULL;
18782 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18783 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18784 image_create_info.extent.width = 32;
18785 image_create_info.extent.height = 1;
18786 image_create_info.extent.depth = 1;
18787 image_create_info.mipLevels = 1;
18788 image_create_info.arrayLayers = 1;
18789 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18790 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18791 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18792 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018793
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018794 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018795 ASSERT_VK_SUCCESS(err);
18796
Karl Schultz6addd812016-02-02 17:17:23 -070018797 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018798
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018799 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018800 ASSERT_VK_SUCCESS(err);
18801
18802 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018803 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018804 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18805 memAlloc.pNext = NULL;
18806 memAlloc.allocationSize = 0;
18807 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018808
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018809 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018810 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018811 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018812 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018813 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018814 ASSERT_VK_SUCCESS(err);
18815
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018816 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018817 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018818 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018819 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018820 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018821 ASSERT_VK_SUCCESS(err);
18822
18823 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18824 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018825 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018826 ASSERT_VK_SUCCESS(err);
18827
Tony Barbour552f6c02016-12-21 14:34:07 -070018828 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018829 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018830 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18831 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018832 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018833 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018834 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018835 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018836 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018837 resolveRegion.srcOffset.x = 0;
18838 resolveRegion.srcOffset.y = 0;
18839 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018840 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018841 resolveRegion.dstSubresource.mipLevel = 0;
18842 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018843 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018844 resolveRegion.dstOffset.x = 0;
18845 resolveRegion.dstOffset.y = 0;
18846 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018847 resolveRegion.extent.width = 1;
18848 resolveRegion.extent.height = 1;
18849 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018850 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018851 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018852
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018853 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018854
Chia-I Wuf7458c52015-10-26 21:10:41 +080018855 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018856 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018857 vkFreeMemory(m_device->device(), srcMem, NULL);
18858 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018859}
18860
Karl Schultz6addd812016-02-02 17:17:23 -070018861TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18862 VkResult err;
18863 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18866 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018867
Tony Barbour1fa09702017-03-16 12:09:08 -060018868 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018869
Chris Forbesa7530692016-05-08 12:35:39 +120018870 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018871 VkImage srcImage;
18872 VkImage dstImage;
18873 VkDeviceMemory srcMem;
18874 VkDeviceMemory destMem;
18875 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018876
18877 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018878 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18879 image_create_info.pNext = NULL;
18880 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18881 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18882 image_create_info.extent.width = 32;
18883 image_create_info.extent.height = 1;
18884 image_create_info.extent.depth = 1;
18885 image_create_info.mipLevels = 1;
18886 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018887 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018888 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18889 // Note: Some implementations expect color attachment usage for any
18890 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018891 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018892 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018894 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018895 ASSERT_VK_SUCCESS(err);
18896
Karl Schultz6addd812016-02-02 17:17:23 -070018897 // Note: Some implementations expect color attachment usage for any
18898 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018899 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018900
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018901 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018902 ASSERT_VK_SUCCESS(err);
18903
18904 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018905 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018906 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18907 memAlloc.pNext = NULL;
18908 memAlloc.allocationSize = 0;
18909 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018910
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018911 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018912 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018913 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018914 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018915 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018916 ASSERT_VK_SUCCESS(err);
18917
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018918 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018919 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018920 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018921 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018922 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018923 ASSERT_VK_SUCCESS(err);
18924
18925 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18926 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018927 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018928 ASSERT_VK_SUCCESS(err);
18929
Tony Barbour552f6c02016-12-21 14:34:07 -070018930 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018931 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018932 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18933 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018934 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018935 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018936 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018937 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018938 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018939 resolveRegion.srcOffset.x = 0;
18940 resolveRegion.srcOffset.y = 0;
18941 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018942 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018943 resolveRegion.dstSubresource.mipLevel = 0;
18944 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018945 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018946 resolveRegion.dstOffset.x = 0;
18947 resolveRegion.dstOffset.y = 0;
18948 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018949 resolveRegion.extent.width = 1;
18950 resolveRegion.extent.height = 1;
18951 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018952 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018953 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018954
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018955 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018956
Chia-I Wuf7458c52015-10-26 21:10:41 +080018957 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018958 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018959 vkFreeMemory(m_device->device(), srcMem, NULL);
18960 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018961}
18962
Karl Schultz6addd812016-02-02 17:17:23 -070018963TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18964 VkResult err;
18965 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018966
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018968 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018969
Tony Barbour1fa09702017-03-16 12:09:08 -060018970 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018971
18972 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018973 VkImage srcImage;
18974 VkImage dstImage;
18975 VkDeviceMemory srcMem;
18976 VkDeviceMemory destMem;
18977 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018978
18979 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018980 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18981 image_create_info.pNext = NULL;
18982 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18983 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18984 image_create_info.extent.width = 32;
18985 image_create_info.extent.height = 1;
18986 image_create_info.extent.depth = 1;
18987 image_create_info.mipLevels = 1;
18988 image_create_info.arrayLayers = 1;
18989 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18990 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18991 // Note: Some implementations expect color attachment usage for any
18992 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018993 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018994 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018995
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018996 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018997 ASSERT_VK_SUCCESS(err);
18998
Karl Schultz6addd812016-02-02 17:17:23 -070018999 // Set format to something other than source image
19000 image_create_info.format = VK_FORMAT_R32_SFLOAT;
19001 // Note: Some implementations expect color attachment usage for any
19002 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019003 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070019004 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060019005
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019006 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060019007 ASSERT_VK_SUCCESS(err);
19008
19009 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019010 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019011 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19012 memAlloc.pNext = NULL;
19013 memAlloc.allocationSize = 0;
19014 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060019015
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060019016 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060019017 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019018 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060019019 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019020 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060019021 ASSERT_VK_SUCCESS(err);
19022
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019023 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060019024 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019025 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060019026 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019027 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060019028 ASSERT_VK_SUCCESS(err);
19029
19030 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
19031 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019032 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060019033 ASSERT_VK_SUCCESS(err);
19034
Tony Barbour552f6c02016-12-21 14:34:07 -070019035 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060019036 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070019037 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
19038 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060019039 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080019040 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060019041 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060019042 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130019043 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060019044 resolveRegion.srcOffset.x = 0;
19045 resolveRegion.srcOffset.y = 0;
19046 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080019047 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019048 resolveRegion.dstSubresource.mipLevel = 0;
19049 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130019050 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019051 resolveRegion.dstOffset.x = 0;
19052 resolveRegion.dstOffset.y = 0;
19053 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060019054 resolveRegion.extent.width = 1;
19055 resolveRegion.extent.height = 1;
19056 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019057 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070019058 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060019059
Chris Forbes8f36a8a2016-04-07 13:21:07 +120019060 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060019061
Chia-I Wuf7458c52015-10-26 21:10:41 +080019062 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019063 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080019064 vkFreeMemory(m_device->device(), srcMem, NULL);
19065 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060019066}
19067
Karl Schultz6addd812016-02-02 17:17:23 -070019068TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
19069 VkResult err;
19070 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060019071
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070019072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019073 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060019074
Tony Barbour1fa09702017-03-16 12:09:08 -060019075 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060019076
19077 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070019078 VkImage srcImage;
19079 VkImage dstImage;
19080 VkDeviceMemory srcMem;
19081 VkDeviceMemory destMem;
19082 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060019083
19084 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019085 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19086 image_create_info.pNext = NULL;
19087 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19088 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19089 image_create_info.extent.width = 32;
19090 image_create_info.extent.height = 1;
19091 image_create_info.extent.depth = 1;
19092 image_create_info.mipLevels = 1;
19093 image_create_info.arrayLayers = 1;
19094 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
19095 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19096 // Note: Some implementations expect color attachment usage for any
19097 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019098 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070019099 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060019100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019101 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060019102 ASSERT_VK_SUCCESS(err);
19103
Karl Schultz6addd812016-02-02 17:17:23 -070019104 image_create_info.imageType = VK_IMAGE_TYPE_1D;
19105 // Note: Some implementations expect color attachment usage for any
19106 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019107 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070019108 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060019109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019110 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060019111 ASSERT_VK_SUCCESS(err);
19112
19113 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019114 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019115 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19116 memAlloc.pNext = NULL;
19117 memAlloc.allocationSize = 0;
19118 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060019119
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060019120 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060019121 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019122 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060019123 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019124 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060019125 ASSERT_VK_SUCCESS(err);
19126
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019127 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060019128 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019129 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060019130 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019131 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060019132 ASSERT_VK_SUCCESS(err);
19133
19134 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
19135 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019136 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060019137 ASSERT_VK_SUCCESS(err);
19138
Tony Barbour552f6c02016-12-21 14:34:07 -070019139 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060019140 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070019141 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
19142 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060019143 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080019144 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060019145 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060019146 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130019147 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060019148 resolveRegion.srcOffset.x = 0;
19149 resolveRegion.srcOffset.y = 0;
19150 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080019151 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019152 resolveRegion.dstSubresource.mipLevel = 0;
19153 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130019154 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019155 resolveRegion.dstOffset.x = 0;
19156 resolveRegion.dstOffset.y = 0;
19157 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060019158 resolveRegion.extent.width = 1;
19159 resolveRegion.extent.height = 1;
19160 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019161 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070019162 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060019163
Chris Forbes8f36a8a2016-04-07 13:21:07 +120019164 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060019165
Chia-I Wuf7458c52015-10-26 21:10:41 +080019166 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019167 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080019168 vkFreeMemory(m_device->device(), srcMem, NULL);
19169 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060019170}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019171
Karl Schultz6addd812016-02-02 17:17:23 -070019172TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019173 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070019174 // to using a DS format, then cause it to hit error due to COLOR_BIT not
19175 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019176 // The image format check comes 2nd in validation so we trigger it first,
19177 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070019178 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19181 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060019182
Tony Barbour1fa09702017-03-16 12:09:08 -060019183 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019184 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019185 if (!depth_format) {
19186 return;
19187 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060019188
Chia-I Wu1b99bb22015-10-27 19:25:11 +080019189 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019190 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19191 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019192
19193 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019194 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19195 ds_pool_ci.pNext = NULL;
19196 ds_pool_ci.maxSets = 1;
19197 ds_pool_ci.poolSizeCount = 1;
19198 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019199
19200 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019201 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019202 ASSERT_VK_SUCCESS(err);
19203
19204 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019205 dsl_binding.binding = 0;
19206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19207 dsl_binding.descriptorCount = 1;
19208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19209 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019210
19211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19213 ds_layout_ci.pNext = NULL;
19214 ds_layout_ci.bindingCount = 1;
19215 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019216 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019217 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019218 ASSERT_VK_SUCCESS(err);
19219
19220 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019221 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080019222 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070019223 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019224 alloc_info.descriptorPool = ds_pool;
19225 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019226 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019227 ASSERT_VK_SUCCESS(err);
19228
Karl Schultz6addd812016-02-02 17:17:23 -070019229 VkImage image_bad;
19230 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019231 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070019232 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019233 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070019234 const int32_t tex_width = 32;
19235 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019236
19237 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070019238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19239 image_create_info.pNext = NULL;
19240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19241 image_create_info.format = tex_format_bad;
19242 image_create_info.extent.width = tex_width;
19243 image_create_info.extent.height = tex_height;
19244 image_create_info.extent.depth = 1;
19245 image_create_info.mipLevels = 1;
19246 image_create_info.arrayLayers = 1;
19247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19248 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019249 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070019250 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019251
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019252 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019253 ASSERT_VK_SUCCESS(err);
19254 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019255 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019257 ASSERT_VK_SUCCESS(err);
19258
Rene Lindsayf1e89c82016-12-28 13:18:31 -070019259 // ---Bind image memory---
19260 VkMemoryRequirements img_mem_reqs;
19261 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
19262 VkMemoryAllocateInfo image_alloc_info = {};
19263 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19264 image_alloc_info.pNext = NULL;
19265 image_alloc_info.memoryTypeIndex = 0;
19266 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019267 bool pass =
19268 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 -070019269 ASSERT_TRUE(pass);
19270 VkDeviceMemory mem;
19271 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
19272 ASSERT_VK_SUCCESS(err);
19273 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
19274 ASSERT_VK_SUCCESS(err);
19275 // -----------------------
19276
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019277 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130019278 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070019279 image_view_create_info.image = image_bad;
19280 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19281 image_view_create_info.format = tex_format_bad;
19282 image_view_create_info.subresourceRange.baseArrayLayer = 0;
19283 image_view_create_info.subresourceRange.baseMipLevel = 0;
19284 image_view_create_info.subresourceRange.layerCount = 1;
19285 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070019286 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019287
19288 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019289 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060019290
Chris Forbes8f36a8a2016-04-07 13:21:07 +120019291 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019292
Chia-I Wuf7458c52015-10-26 21:10:41 +080019293 vkDestroyImage(m_device->device(), image_bad, NULL);
19294 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080019295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070019297
19298 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060019299}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019300
19301TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019302 TEST_DESCRIPTION(
19303 "Call ClearColorImage w/ a depth|stencil image and "
19304 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019305
Tony Barbour1fa09702017-03-16 12:09:08 -060019306 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019307 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019308 if (!depth_format) {
19309 return;
19310 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19312
Tony Barbour552f6c02016-12-21 14:34:07 -070019313 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019314
19315 // Color image
19316 VkClearColorValue clear_color;
19317 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
19318 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
19319 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
19320 const int32_t img_width = 32;
19321 const int32_t img_height = 32;
19322 VkImageCreateInfo image_create_info = {};
19323 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19324 image_create_info.pNext = NULL;
19325 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19326 image_create_info.format = color_format;
19327 image_create_info.extent.width = img_width;
19328 image_create_info.extent.height = img_height;
19329 image_create_info.extent.depth = 1;
19330 image_create_info.mipLevels = 1;
19331 image_create_info.arrayLayers = 1;
19332 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19333 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
19334 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19335
19336 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019337 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019339 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019340
19341 // Depth/Stencil image
19342 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019343 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019344 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
19345 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070019346 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019347 ds_image_create_info.extent.width = 64;
19348 ds_image_create_info.extent.height = 64;
19349 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070019350 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 -060019351
19352 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019353 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019354
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019355 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 -060019356
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019359 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019360 &color_range);
19361
19362 m_errorMonitor->VerifyFound();
19363
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19365 "vkCmdClearColorImage called with "
19366 "image created without "
19367 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060019368
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070019369 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060019370 &color_range);
19371
19372 m_errorMonitor->VerifyFound();
19373
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019374 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19376 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019377
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019378 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
19379 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019380
19381 m_errorMonitor->VerifyFound();
19382}
Tobin Ehliscde08892015-09-22 10:11:37 -060019383
Mike Schuchardt35fece12017-03-07 14:40:28 -070019384TEST_F(VkLayerTest, CommandQueueFlags) {
19385 TEST_DESCRIPTION(
19386 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
19387 "graphics-only command");
19388
19389 ASSERT_NO_FATAL_FAILURE(Init());
19390
19391 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060019392 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070019393 printf(" Non-graphics queue family not found; skipped.\n");
19394 return;
19395 } else {
19396 // Create command pool on a non-graphics queue
19397 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
19398
19399 // Setup command buffer on pool
19400 VkCommandBufferObj command_buffer(m_device, &command_pool);
19401 command_buffer.BeginCommandBuffer();
19402
19403 // Issue a graphics only command
19404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
19405 VkViewport viewport = {0, 0, 16, 16, 0, 1};
19406 command_buffer.SetViewport(0, 1, &viewport);
19407 m_errorMonitor->VerifyFound();
19408 }
19409}
19410
Mark Lobodzinskib8359282017-05-16 09:17:51 -060019411TEST_F(VkLayerTest, ExecuteUnrecordedCBs) {
19412 TEST_DESCRIPTION(
19413 "Attempt vkCmdExecuteCommands and then QueueSubmit with an unrecorded secondary and primary command buffer, respectively");
19414
19415 ASSERT_NO_FATAL_FAILURE(Init());
19416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00155);
19418 // Allocate a secondary command buffer
19419 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19420 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19421 command_buffer_allocate_info.commandPool = m_commandPool->handle();
19422 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19423 command_buffer_allocate_info.commandBufferCount = 1;
19424 VkCommandBuffer secondary_command_buffer;
19425 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19426 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19427 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19428 command_buffer_begin_info.flags =
19429 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19430 command_buffer_begin_info.pInheritanceInfo = nullptr;
19431
19432 // Now update primary cmd buffer to execute unrecorded secondary
19433 VkResult err = vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
19434 ASSERT_VK_SUCCESS(err);
19435 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19436 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
19437 vkCmdEndRenderPass(m_commandBuffer->handle());
19438 err = vkEndCommandBuffer(m_commandBuffer->handle());
19439 ASSERT_VK_SUCCESS(err);
19440 m_errorMonitor->VerifyFound();
19441
19442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00134);
19443 // Allocate a primary command buffer
19444 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19445 command_buffer_allocate_info.commandBufferCount = 1;
19446 VkCommandBuffer primary_command_buffer;
19447 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19448
19449 // And submit the unrecorded command buffer
19450 VkSubmitInfo submit_info = {};
19451 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19452 submit_info.commandBufferCount = 1;
19453 submit_info.pCommandBuffers = &primary_command_buffer;
19454 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19455 m_errorMonitor->VerifyFound();
19456}
19457
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019458// WSI Enabled Tests
19459//
Chris Forbes09368e42016-10-13 11:59:22 +130019460#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019461TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
19462
19463#if defined(VK_USE_PLATFORM_XCB_KHR)
19464 VkSurfaceKHR surface = VK_NULL_HANDLE;
19465
19466 VkResult err;
19467 bool pass;
19468 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
19469 VkSwapchainCreateInfoKHR swapchain_create_info = {};
19470 // uint32_t swapchain_image_count = 0;
19471 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
19472 // uint32_t image_index = 0;
19473 // VkPresentInfoKHR present_info = {};
19474
Tony Barbour1fa09702017-03-16 12:09:08 -060019475 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019476
19477 // Use the create function from one of the VK_KHR_*_surface extension in
19478 // order to create a surface, testing all known errors in the process,
19479 // before successfully creating a surface:
19480 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
19481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
19482 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
19483 pass = (err != VK_SUCCESS);
19484 ASSERT_TRUE(pass);
19485 m_errorMonitor->VerifyFound();
19486
19487 // Next, try to create a surface with the wrong
19488 // VkXcbSurfaceCreateInfoKHR::sType:
19489 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
19490 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19492 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19493 pass = (err != VK_SUCCESS);
19494 ASSERT_TRUE(pass);
19495 m_errorMonitor->VerifyFound();
19496
19497 // Create a native window, and then correctly create a surface:
19498 xcb_connection_t *connection;
19499 xcb_screen_t *screen;
19500 xcb_window_t xcb_window;
19501 xcb_intern_atom_reply_t *atom_wm_delete_window;
19502
19503 const xcb_setup_t *setup;
19504 xcb_screen_iterator_t iter;
19505 int scr;
19506 uint32_t value_mask, value_list[32];
19507 int width = 1;
19508 int height = 1;
19509
19510 connection = xcb_connect(NULL, &scr);
19511 ASSERT_TRUE(connection != NULL);
19512 setup = xcb_get_setup(connection);
19513 iter = xcb_setup_roots_iterator(setup);
19514 while (scr-- > 0)
19515 xcb_screen_next(&iter);
19516 screen = iter.data;
19517
19518 xcb_window = xcb_generate_id(connection);
19519
19520 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
19521 value_list[0] = screen->black_pixel;
19522 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
19523
19524 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
19525 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
19526
19527 /* Magic code that will send notification when window is destroyed */
19528 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
19529 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
19530
19531 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
19532 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
19533 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
19534 free(reply);
19535
19536 xcb_map_window(connection, xcb_window);
19537
19538 // Force the x/y coordinates to 100,100 results are identical in consecutive
19539 // runs
19540 const uint32_t coords[] = { 100, 100 };
19541 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19542
19543 // Finally, try to correctly create a surface:
19544 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19545 xcb_create_info.pNext = NULL;
19546 xcb_create_info.flags = 0;
19547 xcb_create_info.connection = connection;
19548 xcb_create_info.window = xcb_window;
19549 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19550 pass = (err == VK_SUCCESS);
19551 ASSERT_TRUE(pass);
19552
19553 // Check if surface supports presentation:
19554
19555 // 1st, do so without having queried the queue families:
19556 VkBool32 supported = false;
19557 // TODO: Get the following error to come out:
19558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19559 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19560 "function");
19561 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19562 pass = (err != VK_SUCCESS);
19563 // ASSERT_TRUE(pass);
19564 // m_errorMonitor->VerifyFound();
19565
19566 // Next, query a queue family index that's too large:
19567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19568 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19569 pass = (err != VK_SUCCESS);
19570 ASSERT_TRUE(pass);
19571 m_errorMonitor->VerifyFound();
19572
19573 // Finally, do so correctly:
19574 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19575 // SUPPORTED
19576 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19577 pass = (err == VK_SUCCESS);
19578 ASSERT_TRUE(pass);
19579
19580 // Before proceeding, try to create a swapchain without having called
19581 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19582 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19583 swapchain_create_info.pNext = NULL;
19584 swapchain_create_info.flags = 0;
19585 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19586 swapchain_create_info.surface = surface;
19587 swapchain_create_info.imageArrayLayers = 1;
19588 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19589 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19591 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19592 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19593 pass = (err != VK_SUCCESS);
19594 ASSERT_TRUE(pass);
19595 m_errorMonitor->VerifyFound();
19596
19597 // Get the surface capabilities:
19598 VkSurfaceCapabilitiesKHR surface_capabilities;
19599
19600 // Do so correctly (only error logged by this entrypoint is if the
19601 // extension isn't enabled):
19602 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19603 pass = (err == VK_SUCCESS);
19604 ASSERT_TRUE(pass);
19605
19606 // Get the surface formats:
19607 uint32_t surface_format_count;
19608
19609 // First, try without a pointer to surface_format_count:
19610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19611 "specified as NULL");
19612 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19613 pass = (err == VK_SUCCESS);
19614 ASSERT_TRUE(pass);
19615 m_errorMonitor->VerifyFound();
19616
19617 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19618 // correctly done a 1st try (to get the count):
19619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19620 surface_format_count = 0;
19621 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19622 pass = (err == VK_SUCCESS);
19623 ASSERT_TRUE(pass);
19624 m_errorMonitor->VerifyFound();
19625
19626 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19627 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19628 pass = (err == VK_SUCCESS);
19629 ASSERT_TRUE(pass);
19630
19631 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19632 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19633
19634 // Next, do a 2nd try with surface_format_count being set too high:
19635 surface_format_count += 5;
19636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19637 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19638 pass = (err == VK_SUCCESS);
19639 ASSERT_TRUE(pass);
19640 m_errorMonitor->VerifyFound();
19641
19642 // Finally, do a correct 1st and 2nd try:
19643 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19644 pass = (err == VK_SUCCESS);
19645 ASSERT_TRUE(pass);
19646 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19647 pass = (err == VK_SUCCESS);
19648 ASSERT_TRUE(pass);
19649
19650 // Get the surface present modes:
19651 uint32_t surface_present_mode_count;
19652
19653 // First, try without a pointer to surface_format_count:
19654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19655 "specified as NULL");
19656
19657 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19658 pass = (err == VK_SUCCESS);
19659 ASSERT_TRUE(pass);
19660 m_errorMonitor->VerifyFound();
19661
19662 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19663 // correctly done a 1st try (to get the count):
19664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19665 surface_present_mode_count = 0;
19666 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19667 (VkPresentModeKHR *)&surface_present_mode_count);
19668 pass = (err == VK_SUCCESS);
19669 ASSERT_TRUE(pass);
19670 m_errorMonitor->VerifyFound();
19671
19672 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19673 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19674 pass = (err == VK_SUCCESS);
19675 ASSERT_TRUE(pass);
19676
19677 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19678 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19679
19680 // Next, do a 2nd try with surface_format_count being set too high:
19681 surface_present_mode_count += 5;
19682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19683 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19684 pass = (err == VK_SUCCESS);
19685 ASSERT_TRUE(pass);
19686 m_errorMonitor->VerifyFound();
19687
19688 // Finally, do a correct 1st and 2nd try:
19689 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19690 pass = (err == VK_SUCCESS);
19691 ASSERT_TRUE(pass);
19692 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19693 pass = (err == VK_SUCCESS);
19694 ASSERT_TRUE(pass);
19695
19696 // Create a swapchain:
19697
19698 // First, try without a pointer to swapchain_create_info:
19699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19700 "specified as NULL");
19701
19702 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19703 pass = (err != VK_SUCCESS);
19704 ASSERT_TRUE(pass);
19705 m_errorMonitor->VerifyFound();
19706
19707 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19708 // sType:
19709 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19711
19712 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19713 pass = (err != VK_SUCCESS);
19714 ASSERT_TRUE(pass);
19715 m_errorMonitor->VerifyFound();
19716
19717 // Next, call with a NULL swapchain pointer:
19718 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19719 swapchain_create_info.pNext = NULL;
19720 swapchain_create_info.flags = 0;
19721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19722 "specified as NULL");
19723
19724 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19725 pass = (err != VK_SUCCESS);
19726 ASSERT_TRUE(pass);
19727 m_errorMonitor->VerifyFound();
19728
19729 // TODO: Enhance swapchain layer so that
19730 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19731
19732 // Next, call with a queue family index that's too large:
19733 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19734 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19735 swapchain_create_info.queueFamilyIndexCount = 2;
19736 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19738 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19739 pass = (err != VK_SUCCESS);
19740 ASSERT_TRUE(pass);
19741 m_errorMonitor->VerifyFound();
19742
19743 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19744 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19745 swapchain_create_info.queueFamilyIndexCount = 1;
19746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19747 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19748 "pCreateInfo->pQueueFamilyIndices).");
19749 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19750 pass = (err != VK_SUCCESS);
19751 ASSERT_TRUE(pass);
19752 m_errorMonitor->VerifyFound();
19753
19754 // Next, call with an invalid imageSharingMode:
19755 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19756 swapchain_create_info.queueFamilyIndexCount = 1;
19757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19758 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19759 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19760 pass = (err != VK_SUCCESS);
19761 ASSERT_TRUE(pass);
19762 m_errorMonitor->VerifyFound();
19763 // Fix for the future:
19764 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19765 // SUPPORTED
19766 swapchain_create_info.queueFamilyIndexCount = 0;
19767 queueFamilyIndex[0] = 0;
19768 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19769
19770 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19771 // Get the images from a swapchain:
19772 // Acquire an image from a swapchain:
19773 // Present an image to a swapchain:
19774 // Destroy the swapchain:
19775
19776 // TODOs:
19777 //
19778 // - Try destroying the device without first destroying the swapchain
19779 //
19780 // - Try destroying the device without first destroying the surface
19781 //
19782 // - Try destroying the surface without first destroying the swapchain
19783
19784 // Destroy the surface:
19785 vkDestroySurfaceKHR(instance(), surface, NULL);
19786
19787 // Tear down the window:
19788 xcb_destroy_window(connection, xcb_window);
19789 xcb_disconnect(connection);
19790
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019791#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019792 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019793#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019794}
Chris Forbes09368e42016-10-13 11:59:22 +130019795#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019796
19797//
19798// POSITIVE VALIDATION TESTS
19799//
19800// These tests do not expect to encounter ANY validation errors pass only if this is true
19801
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019802TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19803 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019804 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19806
19807 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19808 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019809 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019810 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19811 command_buffer_allocate_info.commandBufferCount = 1;
19812
19813 VkCommandBuffer secondary_command_buffer;
19814 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19815 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19816 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19817 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19818 command_buffer_inheritance_info.renderPass = m_renderPass;
19819 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19820
19821 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19822 command_buffer_begin_info.flags =
19823 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19824 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19825
19826 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19827 VkClearAttachment color_attachment;
19828 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19829 color_attachment.clearValue.color.float32[0] = 0;
19830 color_attachment.clearValue.color.float32[1] = 0;
19831 color_attachment.clearValue.color.float32[2] = 0;
19832 color_attachment.clearValue.color.float32[3] = 0;
19833 color_attachment.colorAttachment = 0;
19834 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19835 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19836}
19837
Tobin Ehlise0006882016-11-03 10:14:28 -060019838TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019839 TEST_DESCRIPTION(
19840 "Perform an image layout transition in a secondary command buffer followed "
19841 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019842 VkResult err;
19843 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019844 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019845 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019846 if (!depth_format) {
19847 return;
19848 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19850 // Allocate a secondary and primary cmd buffer
19851 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19852 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019853 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019854 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19855 command_buffer_allocate_info.commandBufferCount = 1;
19856
19857 VkCommandBuffer secondary_command_buffer;
19858 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19859 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19860 VkCommandBuffer primary_command_buffer;
19861 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19862 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19863 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19864 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19865 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19866 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19867 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19868
19869 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19870 ASSERT_VK_SUCCESS(err);
19871 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019872 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 -060019873 ASSERT_TRUE(image.initialized());
19874 VkImageMemoryBarrier img_barrier = {};
19875 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19876 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19877 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19878 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19879 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19880 img_barrier.image = image.handle();
19881 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19882 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19883 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19884 img_barrier.subresourceRange.baseArrayLayer = 0;
19885 img_barrier.subresourceRange.baseMipLevel = 0;
19886 img_barrier.subresourceRange.layerCount = 1;
19887 img_barrier.subresourceRange.levelCount = 1;
19888 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19889 0, nullptr, 1, &img_barrier);
19890 err = vkEndCommandBuffer(secondary_command_buffer);
19891 ASSERT_VK_SUCCESS(err);
19892
19893 // Now update primary cmd buffer to execute secondary and transitions image
19894 command_buffer_begin_info.pInheritanceInfo = nullptr;
19895 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19896 ASSERT_VK_SUCCESS(err);
19897 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19898 VkImageMemoryBarrier img_barrier2 = {};
19899 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19900 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19901 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19902 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19903 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19904 img_barrier2.image = image.handle();
19905 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19906 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19907 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19908 img_barrier2.subresourceRange.baseArrayLayer = 0;
19909 img_barrier2.subresourceRange.baseMipLevel = 0;
19910 img_barrier2.subresourceRange.layerCount = 1;
19911 img_barrier2.subresourceRange.levelCount = 1;
19912 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19913 nullptr, 1, &img_barrier2);
19914 err = vkEndCommandBuffer(primary_command_buffer);
19915 ASSERT_VK_SUCCESS(err);
19916 VkSubmitInfo submit_info = {};
19917 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19918 submit_info.commandBufferCount = 1;
19919 submit_info.pCommandBuffers = &primary_command_buffer;
19920 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19921 ASSERT_VK_SUCCESS(err);
19922 m_errorMonitor->VerifyNotFound();
19923 err = vkDeviceWaitIdle(m_device->device());
19924 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019925 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19926 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019927}
19928
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019929// This is a positive test. No failures are expected.
19930TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019931 TEST_DESCRIPTION(
19932 "Ensure that the vkUpdateDescriptorSets validation code "
19933 "is ignoring VkWriteDescriptorSet members that are not "
19934 "related to the descriptor type specified by "
19935 "VkWriteDescriptorSet::descriptorType. Correct "
19936 "validation behavior will result in the test running to "
19937 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019938
19939 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19940
Tony Barbour1fa09702017-03-16 12:09:08 -060019941 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019942
19943 // Image Case
19944 {
19945 m_errorMonitor->ExpectSuccess();
19946
19947 VkImage image;
19948 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19949 const int32_t tex_width = 32;
19950 const int32_t tex_height = 32;
19951 VkImageCreateInfo image_create_info = {};
19952 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19953 image_create_info.pNext = NULL;
19954 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19955 image_create_info.format = tex_format;
19956 image_create_info.extent.width = tex_width;
19957 image_create_info.extent.height = tex_height;
19958 image_create_info.extent.depth = 1;
19959 image_create_info.mipLevels = 1;
19960 image_create_info.arrayLayers = 1;
19961 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19962 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19963 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19964 image_create_info.flags = 0;
19965 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19966 ASSERT_VK_SUCCESS(err);
19967
19968 VkMemoryRequirements memory_reqs;
19969 VkDeviceMemory image_memory;
19970 bool pass;
19971 VkMemoryAllocateInfo memory_info = {};
19972 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19973 memory_info.pNext = NULL;
19974 memory_info.allocationSize = 0;
19975 memory_info.memoryTypeIndex = 0;
19976 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19977 memory_info.allocationSize = memory_reqs.size;
19978 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19979 ASSERT_TRUE(pass);
19980 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19981 ASSERT_VK_SUCCESS(err);
19982 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19983 ASSERT_VK_SUCCESS(err);
19984
19985 VkImageViewCreateInfo image_view_create_info = {};
19986 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19987 image_view_create_info.image = image;
19988 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19989 image_view_create_info.format = tex_format;
19990 image_view_create_info.subresourceRange.layerCount = 1;
19991 image_view_create_info.subresourceRange.baseMipLevel = 0;
19992 image_view_create_info.subresourceRange.levelCount = 1;
19993 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19994
19995 VkImageView view;
19996 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19997 ASSERT_VK_SUCCESS(err);
19998
19999 VkDescriptorPoolSize ds_type_count = {};
20000 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
20001 ds_type_count.descriptorCount = 1;
20002
20003 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20004 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20005 ds_pool_ci.pNext = NULL;
20006 ds_pool_ci.maxSets = 1;
20007 ds_pool_ci.poolSizeCount = 1;
20008 ds_pool_ci.pPoolSizes = &ds_type_count;
20009
20010 VkDescriptorPool ds_pool;
20011 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20012 ASSERT_VK_SUCCESS(err);
20013
20014 VkDescriptorSetLayoutBinding dsl_binding = {};
20015 dsl_binding.binding = 0;
20016 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
20017 dsl_binding.descriptorCount = 1;
20018 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
20019 dsl_binding.pImmutableSamplers = NULL;
20020
20021 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20022 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20023 ds_layout_ci.pNext = NULL;
20024 ds_layout_ci.bindingCount = 1;
20025 ds_layout_ci.pBindings = &dsl_binding;
20026 VkDescriptorSetLayout ds_layout;
20027 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20028 ASSERT_VK_SUCCESS(err);
20029
20030 VkDescriptorSet descriptor_set;
20031 VkDescriptorSetAllocateInfo alloc_info = {};
20032 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20033 alloc_info.descriptorSetCount = 1;
20034 alloc_info.descriptorPool = ds_pool;
20035 alloc_info.pSetLayouts = &ds_layout;
20036 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20037 ASSERT_VK_SUCCESS(err);
20038
20039 VkDescriptorImageInfo image_info = {};
20040 image_info.imageView = view;
20041 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20042
20043 VkWriteDescriptorSet descriptor_write;
20044 memset(&descriptor_write, 0, sizeof(descriptor_write));
20045 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20046 descriptor_write.dstSet = descriptor_set;
20047 descriptor_write.dstBinding = 0;
20048 descriptor_write.descriptorCount = 1;
20049 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
20050 descriptor_write.pImageInfo = &image_info;
20051
20052 // Set pBufferInfo and pTexelBufferView to invalid values, which should
20053 // be
20054 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
20055 // This will most likely produce a crash if the parameter_validation
20056 // layer
20057 // does not correctly ignore pBufferInfo.
20058 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
20059 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
20060
20061 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20062
20063 m_errorMonitor->VerifyNotFound();
20064
20065 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20066 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20067 vkDestroyImageView(m_device->device(), view, NULL);
20068 vkDestroyImage(m_device->device(), image, NULL);
20069 vkFreeMemory(m_device->device(), image_memory, NULL);
20070 }
20071
20072 // Buffer Case
20073 {
20074 m_errorMonitor->ExpectSuccess();
20075
20076 VkBuffer buffer;
20077 uint32_t queue_family_index = 0;
20078 VkBufferCreateInfo buffer_create_info = {};
20079 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20080 buffer_create_info.size = 1024;
20081 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20082 buffer_create_info.queueFamilyIndexCount = 1;
20083 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
20084
20085 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
20086 ASSERT_VK_SUCCESS(err);
20087
20088 VkMemoryRequirements memory_reqs;
20089 VkDeviceMemory buffer_memory;
20090 bool pass;
20091 VkMemoryAllocateInfo memory_info = {};
20092 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20093 memory_info.pNext = NULL;
20094 memory_info.allocationSize = 0;
20095 memory_info.memoryTypeIndex = 0;
20096
20097 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
20098 memory_info.allocationSize = memory_reqs.size;
20099 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20100 ASSERT_TRUE(pass);
20101
20102 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20103 ASSERT_VK_SUCCESS(err);
20104 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20105 ASSERT_VK_SUCCESS(err);
20106
20107 VkDescriptorPoolSize ds_type_count = {};
20108 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20109 ds_type_count.descriptorCount = 1;
20110
20111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20113 ds_pool_ci.pNext = NULL;
20114 ds_pool_ci.maxSets = 1;
20115 ds_pool_ci.poolSizeCount = 1;
20116 ds_pool_ci.pPoolSizes = &ds_type_count;
20117
20118 VkDescriptorPool ds_pool;
20119 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20120 ASSERT_VK_SUCCESS(err);
20121
20122 VkDescriptorSetLayoutBinding dsl_binding = {};
20123 dsl_binding.binding = 0;
20124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20125 dsl_binding.descriptorCount = 1;
20126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
20127 dsl_binding.pImmutableSamplers = NULL;
20128
20129 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20130 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20131 ds_layout_ci.pNext = NULL;
20132 ds_layout_ci.bindingCount = 1;
20133 ds_layout_ci.pBindings = &dsl_binding;
20134 VkDescriptorSetLayout ds_layout;
20135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20136 ASSERT_VK_SUCCESS(err);
20137
20138 VkDescriptorSet descriptor_set;
20139 VkDescriptorSetAllocateInfo alloc_info = {};
20140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20141 alloc_info.descriptorSetCount = 1;
20142 alloc_info.descriptorPool = ds_pool;
20143 alloc_info.pSetLayouts = &ds_layout;
20144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20145 ASSERT_VK_SUCCESS(err);
20146
20147 VkDescriptorBufferInfo buffer_info = {};
20148 buffer_info.buffer = buffer;
20149 buffer_info.offset = 0;
20150 buffer_info.range = 1024;
20151
20152 VkWriteDescriptorSet descriptor_write;
20153 memset(&descriptor_write, 0, sizeof(descriptor_write));
20154 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20155 descriptor_write.dstSet = descriptor_set;
20156 descriptor_write.dstBinding = 0;
20157 descriptor_write.descriptorCount = 1;
20158 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20159 descriptor_write.pBufferInfo = &buffer_info;
20160
20161 // Set pImageInfo and pTexelBufferView to invalid values, which should
20162 // be
20163 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
20164 // This will most likely produce a crash if the parameter_validation
20165 // layer
20166 // does not correctly ignore pImageInfo.
20167 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
20168 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
20169
20170 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20171
20172 m_errorMonitor->VerifyNotFound();
20173
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20175 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20176 vkDestroyBuffer(m_device->device(), buffer, NULL);
20177 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20178 }
20179
20180 // Texel Buffer Case
20181 {
20182 m_errorMonitor->ExpectSuccess();
20183
20184 VkBuffer buffer;
20185 uint32_t queue_family_index = 0;
20186 VkBufferCreateInfo buffer_create_info = {};
20187 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20188 buffer_create_info.size = 1024;
20189 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
20190 buffer_create_info.queueFamilyIndexCount = 1;
20191 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
20192
20193 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
20194 ASSERT_VK_SUCCESS(err);
20195
20196 VkMemoryRequirements memory_reqs;
20197 VkDeviceMemory buffer_memory;
20198 bool pass;
20199 VkMemoryAllocateInfo memory_info = {};
20200 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20201 memory_info.pNext = NULL;
20202 memory_info.allocationSize = 0;
20203 memory_info.memoryTypeIndex = 0;
20204
20205 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
20206 memory_info.allocationSize = memory_reqs.size;
20207 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20208 ASSERT_TRUE(pass);
20209
20210 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20211 ASSERT_VK_SUCCESS(err);
20212 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20213 ASSERT_VK_SUCCESS(err);
20214
20215 VkBufferViewCreateInfo buff_view_ci = {};
20216 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
20217 buff_view_ci.buffer = buffer;
20218 buff_view_ci.format = VK_FORMAT_R8_UNORM;
20219 buff_view_ci.range = VK_WHOLE_SIZE;
20220 VkBufferView buffer_view;
20221 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
20222
20223 VkDescriptorPoolSize ds_type_count = {};
20224 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
20225 ds_type_count.descriptorCount = 1;
20226
20227 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20228 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20229 ds_pool_ci.pNext = NULL;
20230 ds_pool_ci.maxSets = 1;
20231 ds_pool_ci.poolSizeCount = 1;
20232 ds_pool_ci.pPoolSizes = &ds_type_count;
20233
20234 VkDescriptorPool ds_pool;
20235 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20236 ASSERT_VK_SUCCESS(err);
20237
20238 VkDescriptorSetLayoutBinding dsl_binding = {};
20239 dsl_binding.binding = 0;
20240 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
20241 dsl_binding.descriptorCount = 1;
20242 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
20243 dsl_binding.pImmutableSamplers = NULL;
20244
20245 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20246 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20247 ds_layout_ci.pNext = NULL;
20248 ds_layout_ci.bindingCount = 1;
20249 ds_layout_ci.pBindings = &dsl_binding;
20250 VkDescriptorSetLayout ds_layout;
20251 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20252 ASSERT_VK_SUCCESS(err);
20253
20254 VkDescriptorSet descriptor_set;
20255 VkDescriptorSetAllocateInfo alloc_info = {};
20256 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20257 alloc_info.descriptorSetCount = 1;
20258 alloc_info.descriptorPool = ds_pool;
20259 alloc_info.pSetLayouts = &ds_layout;
20260 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20261 ASSERT_VK_SUCCESS(err);
20262
20263 VkWriteDescriptorSet descriptor_write;
20264 memset(&descriptor_write, 0, sizeof(descriptor_write));
20265 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20266 descriptor_write.dstSet = descriptor_set;
20267 descriptor_write.dstBinding = 0;
20268 descriptor_write.descriptorCount = 1;
20269 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
20270 descriptor_write.pTexelBufferView = &buffer_view;
20271
20272 // Set pImageInfo and pBufferInfo to invalid values, which should be
20273 // ignored for descriptorType ==
20274 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
20275 // This will most likely produce a crash if the parameter_validation
20276 // layer
20277 // does not correctly ignore pImageInfo and pBufferInfo.
20278 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
20279 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
20280
20281 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20282
20283 m_errorMonitor->VerifyNotFound();
20284
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020285 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20286 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20287 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
20288 vkDestroyBuffer(m_device->device(), buffer, NULL);
20289 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20290 }
20291}
20292
Tobin Ehlis8893af82017-05-08 12:52:25 -060020293TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
20294 TEST_DESCRIPTION(
20295 "Bind a DescriptorSet with only an immutable sampler"
20296 "and make sure that we don't warn for no update.");
20297
20298 ASSERT_NO_FATAL_FAILURE(Init());
20299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20300
20301 VkDescriptorPoolSize ds_type_count = {};
20302 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
20303 ds_type_count.descriptorCount = 1;
20304
20305 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20306 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20307 ds_pool_ci.maxSets = 1;
20308 ds_pool_ci.poolSizeCount = 1;
20309 ds_pool_ci.pPoolSizes = &ds_type_count;
20310
20311 VkDescriptorPool ds_pool;
20312 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20313 ASSERT_VK_SUCCESS(err);
20314
20315 VkSamplerCreateInfo sampler_ci = {};
20316 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
20317 sampler_ci.pNext = NULL;
20318 sampler_ci.magFilter = VK_FILTER_NEAREST;
20319 sampler_ci.minFilter = VK_FILTER_NEAREST;
20320 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
20321 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
20322 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
20323 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
20324 sampler_ci.mipLodBias = 1.0;
20325 sampler_ci.anisotropyEnable = VK_FALSE;
20326 sampler_ci.maxAnisotropy = 1;
20327 sampler_ci.compareEnable = VK_FALSE;
20328 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
20329 sampler_ci.minLod = 1.0;
20330 sampler_ci.maxLod = 1.0;
20331 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
20332 sampler_ci.unnormalizedCoordinates = VK_FALSE;
20333 VkSampler sampler;
20334
20335 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
20336 ASSERT_VK_SUCCESS(err);
20337
20338 VkDescriptorSetLayoutBinding layout_binding = {};
20339 layout_binding.binding = 0;
20340 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
20341 layout_binding.descriptorCount = 1;
20342 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20343 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
20344
20345 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20346 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20347 ds_layout_ci.bindingCount = 1;
20348 ds_layout_ci.pBindings = &layout_binding;
20349 VkDescriptorSetLayout ds_layout;
20350 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20351 ASSERT_VK_SUCCESS(err);
20352
20353 VkDescriptorSetAllocateInfo alloc_info = {};
20354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20355 alloc_info.descriptorSetCount = 1;
20356 alloc_info.descriptorPool = ds_pool;
20357 alloc_info.pSetLayouts = &ds_layout;
20358 VkDescriptorSet descriptor_set;
20359 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20360 ASSERT_VK_SUCCESS(err);
20361
20362 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20363 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20364 pipeline_layout_ci.pNext = NULL;
20365 pipeline_layout_ci.setLayoutCount = 1;
20366 pipeline_layout_ci.pSetLayouts = &ds_layout;
20367
20368 VkPipelineLayout pipeline_layout;
20369 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20370 ASSERT_VK_SUCCESS(err);
20371
20372 m_errorMonitor->ExpectSuccess();
20373 m_commandBuffer->BeginCommandBuffer();
20374 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
20375
20376 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20377 &descriptor_set, 0, nullptr);
20378 m_errorMonitor->VerifyNotFound();
20379
20380 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20381 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20382 vkDestroySampler(m_device->device(), sampler, NULL);
20383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20384}
20385
Tobin Ehlisf7428442016-10-25 07:58:24 -060020386TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
20387 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
20388
Tony Barbour1fa09702017-03-16 12:09:08 -060020389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060020390 // Create layout where two binding #s are "1"
20391 static const uint32_t NUM_BINDINGS = 3;
20392 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20393 dsl_binding[0].binding = 1;
20394 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20395 dsl_binding[0].descriptorCount = 1;
20396 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20397 dsl_binding[0].pImmutableSamplers = NULL;
20398 dsl_binding[1].binding = 0;
20399 dsl_binding[1].descriptorCount = 1;
20400 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20401 dsl_binding[1].descriptorCount = 1;
20402 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20403 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020404 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060020405 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20406 dsl_binding[2].descriptorCount = 1;
20407 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20408 dsl_binding[2].pImmutableSamplers = NULL;
20409
20410 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20411 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20412 ds_layout_ci.pNext = NULL;
20413 ds_layout_ci.bindingCount = NUM_BINDINGS;
20414 ds_layout_ci.pBindings = dsl_binding;
20415 VkDescriptorSetLayout ds_layout;
20416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
20417 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20418 m_errorMonitor->VerifyFound();
20419}
20420
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020421TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020422 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
20423
Tony Barbour1fa09702017-03-16 12:09:08 -060020424 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020425
Tony Barbour552f6c02016-12-21 14:34:07 -070020426 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020427
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020428 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
20429
20430 {
20431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
20432 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
20433 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20434 m_errorMonitor->VerifyFound();
20435 }
20436
20437 {
20438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
20439 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
20440 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20441 m_errorMonitor->VerifyFound();
20442 }
20443
20444 {
20445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20446 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
20447 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20448 m_errorMonitor->VerifyFound();
20449 }
20450
20451 {
20452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20453 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
20454 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20455 m_errorMonitor->VerifyFound();
20456 }
20457
20458 {
20459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
20460 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
20461 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20462 m_errorMonitor->VerifyFound();
20463 }
20464
20465 {
20466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
20467 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
20468 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20469 m_errorMonitor->VerifyFound();
20470 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020471
20472 {
20473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20474 VkRect2D scissor = {{-1, 0}, {16, 16}};
20475 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20476 m_errorMonitor->VerifyFound();
20477 }
20478
20479 {
20480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20481 VkRect2D scissor = {{0, -2}, {16, 16}};
20482 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20483 m_errorMonitor->VerifyFound();
20484 }
20485
20486 {
20487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
20488 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
20489 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20490 m_errorMonitor->VerifyFound();
20491 }
20492
20493 {
20494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
20495 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
20496 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20497 m_errorMonitor->VerifyFound();
20498 }
20499
Tony Barbour552f6c02016-12-21 14:34:07 -070020500 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020501}
20502
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020503// This is a positive test. No failures are expected.
20504TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
20505 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
20506 VkResult err;
20507
Tony Barbour1fa09702017-03-16 12:09:08 -060020508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020509 m_errorMonitor->ExpectSuccess();
20510 VkDescriptorPoolSize ds_type_count = {};
20511 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20512 ds_type_count.descriptorCount = 2;
20513
20514 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20515 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20516 ds_pool_ci.pNext = NULL;
20517 ds_pool_ci.maxSets = 1;
20518 ds_pool_ci.poolSizeCount = 1;
20519 ds_pool_ci.pPoolSizes = &ds_type_count;
20520
20521 VkDescriptorPool ds_pool;
20522 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20523 ASSERT_VK_SUCCESS(err);
20524
20525 // Create layout with two uniform buffer descriptors w/ empty binding between them
20526 static const uint32_t NUM_BINDINGS = 3;
20527 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20528 dsl_binding[0].binding = 0;
20529 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20530 dsl_binding[0].descriptorCount = 1;
20531 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
20532 dsl_binding[0].pImmutableSamplers = NULL;
20533 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020534 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020535 dsl_binding[2].binding = 2;
20536 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20537 dsl_binding[2].descriptorCount = 1;
20538 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
20539 dsl_binding[2].pImmutableSamplers = NULL;
20540
20541 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20542 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20543 ds_layout_ci.pNext = NULL;
20544 ds_layout_ci.bindingCount = NUM_BINDINGS;
20545 ds_layout_ci.pBindings = dsl_binding;
20546 VkDescriptorSetLayout ds_layout;
20547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20548 ASSERT_VK_SUCCESS(err);
20549
20550 VkDescriptorSet descriptor_set = {};
20551 VkDescriptorSetAllocateInfo alloc_info = {};
20552 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20553 alloc_info.descriptorSetCount = 1;
20554 alloc_info.descriptorPool = ds_pool;
20555 alloc_info.pSetLayouts = &ds_layout;
20556 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20557 ASSERT_VK_SUCCESS(err);
20558
20559 // Create a buffer to be used for update
20560 VkBufferCreateInfo buff_ci = {};
20561 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20562 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20563 buff_ci.size = 256;
20564 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20565 VkBuffer buffer;
20566 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20567 ASSERT_VK_SUCCESS(err);
20568 // Have to bind memory to buffer before descriptor update
20569 VkMemoryAllocateInfo mem_alloc = {};
20570 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20571 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020572 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020573 mem_alloc.memoryTypeIndex = 0;
20574
20575 VkMemoryRequirements mem_reqs;
20576 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20577 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20578 if (!pass) {
20579 vkDestroyBuffer(m_device->device(), buffer, NULL);
20580 return;
20581 }
20582
20583 VkDeviceMemory mem;
20584 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20585 ASSERT_VK_SUCCESS(err);
20586 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20587 ASSERT_VK_SUCCESS(err);
20588
20589 // Only update the descriptor at binding 2
20590 VkDescriptorBufferInfo buff_info = {};
20591 buff_info.buffer = buffer;
20592 buff_info.offset = 0;
20593 buff_info.range = VK_WHOLE_SIZE;
20594 VkWriteDescriptorSet descriptor_write = {};
20595 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20596 descriptor_write.dstBinding = 2;
20597 descriptor_write.descriptorCount = 1;
20598 descriptor_write.pTexelBufferView = nullptr;
20599 descriptor_write.pBufferInfo = &buff_info;
20600 descriptor_write.pImageInfo = nullptr;
20601 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20602 descriptor_write.dstSet = descriptor_set;
20603
20604 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20605
20606 m_errorMonitor->VerifyNotFound();
20607 // Cleanup
20608 vkFreeMemory(m_device->device(), mem, NULL);
20609 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20610 vkDestroyBuffer(m_device->device(), buffer, NULL);
20611 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20612}
20613
20614// This is a positive test. No failures are expected.
20615TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20616 VkResult err;
20617 bool pass;
20618
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020619 TEST_DESCRIPTION(
20620 "Create a buffer, allocate memory, bind memory, destroy "
20621 "the buffer, create an image, and bind the same memory to "
20622 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020623
20624 m_errorMonitor->ExpectSuccess();
20625
Tony Barbour1fa09702017-03-16 12:09:08 -060020626 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020627
20628 VkBuffer buffer;
20629 VkImage image;
20630 VkDeviceMemory mem;
20631 VkMemoryRequirements mem_reqs;
20632
20633 VkBufferCreateInfo buf_info = {};
20634 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20635 buf_info.pNext = NULL;
20636 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20637 buf_info.size = 256;
20638 buf_info.queueFamilyIndexCount = 0;
20639 buf_info.pQueueFamilyIndices = NULL;
20640 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20641 buf_info.flags = 0;
20642 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20643 ASSERT_VK_SUCCESS(err);
20644
20645 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20646
20647 VkMemoryAllocateInfo alloc_info = {};
20648 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20649 alloc_info.pNext = NULL;
20650 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020651
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020652 // Ensure memory is big enough for both bindings
20653 alloc_info.allocationSize = 0x10000;
20654
20655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20656 if (!pass) {
20657 vkDestroyBuffer(m_device->device(), buffer, NULL);
20658 return;
20659 }
20660
20661 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20662 ASSERT_VK_SUCCESS(err);
20663
20664 uint8_t *pData;
20665 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20666 ASSERT_VK_SUCCESS(err);
20667
20668 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20669
20670 vkUnmapMemory(m_device->device(), mem);
20671
20672 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20673 ASSERT_VK_SUCCESS(err);
20674
20675 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20676 // memory. In fact, it was never used by the GPU.
20677 // Just be be sure, wait for idle.
20678 vkDestroyBuffer(m_device->device(), buffer, NULL);
20679 vkDeviceWaitIdle(m_device->device());
20680
Tobin Ehlis6a005702016-12-28 15:25:56 -070020681 // Use optimal as some platforms report linear support but then fail image creation
20682 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20683 VkImageFormatProperties image_format_properties;
20684 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20685 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20686 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020687 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020688 vkFreeMemory(m_device->device(), mem, NULL);
20689 return;
20690 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020691 VkImageCreateInfo image_create_info = {};
20692 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20693 image_create_info.pNext = NULL;
20694 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20695 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20696 image_create_info.extent.width = 64;
20697 image_create_info.extent.height = 64;
20698 image_create_info.extent.depth = 1;
20699 image_create_info.mipLevels = 1;
20700 image_create_info.arrayLayers = 1;
20701 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020702 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020703 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20704 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20705 image_create_info.queueFamilyIndexCount = 0;
20706 image_create_info.pQueueFamilyIndices = NULL;
20707 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20708 image_create_info.flags = 0;
20709
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020710 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020711 * to be textures or it will be the staging image if they are not.
20712 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020713 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20714 ASSERT_VK_SUCCESS(err);
20715
20716 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20717
Tobin Ehlis6a005702016-12-28 15:25:56 -070020718 VkMemoryAllocateInfo mem_alloc = {};
20719 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20720 mem_alloc.pNext = NULL;
20721 mem_alloc.allocationSize = 0;
20722 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020723 mem_alloc.allocationSize = mem_reqs.size;
20724
20725 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20726 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020727 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020728 vkDestroyImage(m_device->device(), image, NULL);
20729 return;
20730 }
20731
20732 // VALIDATION FAILURE:
20733 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20734 ASSERT_VK_SUCCESS(err);
20735
20736 m_errorMonitor->VerifyNotFound();
20737
20738 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020739 vkDestroyImage(m_device->device(), image, NULL);
20740}
20741
Tony Barbourab713912017-02-02 14:17:35 -070020742// This is a positive test. No failures are expected.
20743TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20744 VkResult err;
20745
20746 TEST_DESCRIPTION(
20747 "Call all applicable destroy and free routines with NULL"
20748 "handles, expecting no validation errors");
20749
20750 m_errorMonitor->ExpectSuccess();
20751
Tony Barbour1fa09702017-03-16 12:09:08 -060020752 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020753 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20754 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20755 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20756 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20757 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20758 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20759 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20760 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20761 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20762 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20763 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20764 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20765 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20766 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20767 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20768 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20769 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20770 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20771 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20772 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20773
20774 VkCommandPool command_pool;
20775 VkCommandPoolCreateInfo pool_create_info{};
20776 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20777 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20778 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20779 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20780 VkCommandBuffer command_buffers[3] = {};
20781 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20782 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20783 command_buffer_allocate_info.commandPool = command_pool;
20784 command_buffer_allocate_info.commandBufferCount = 1;
20785 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20786 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20787 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20788 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20789
20790 VkDescriptorPoolSize ds_type_count = {};
20791 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20792 ds_type_count.descriptorCount = 1;
20793
20794 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20795 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20796 ds_pool_ci.pNext = NULL;
20797 ds_pool_ci.maxSets = 1;
20798 ds_pool_ci.poolSizeCount = 1;
20799 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20800 ds_pool_ci.pPoolSizes = &ds_type_count;
20801
20802 VkDescriptorPool ds_pool;
20803 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20804 ASSERT_VK_SUCCESS(err);
20805
20806 VkDescriptorSetLayoutBinding dsl_binding = {};
20807 dsl_binding.binding = 2;
20808 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20809 dsl_binding.descriptorCount = 1;
20810 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20811 dsl_binding.pImmutableSamplers = NULL;
20812 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20813 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20814 ds_layout_ci.pNext = NULL;
20815 ds_layout_ci.bindingCount = 1;
20816 ds_layout_ci.pBindings = &dsl_binding;
20817 VkDescriptorSetLayout ds_layout;
20818 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20819 ASSERT_VK_SUCCESS(err);
20820
20821 VkDescriptorSet descriptor_sets[3] = {};
20822 VkDescriptorSetAllocateInfo alloc_info = {};
20823 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20824 alloc_info.descriptorSetCount = 1;
20825 alloc_info.descriptorPool = ds_pool;
20826 alloc_info.pSetLayouts = &ds_layout;
20827 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20828 ASSERT_VK_SUCCESS(err);
20829 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20830 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20831 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20832
20833 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20834
20835 m_errorMonitor->VerifyNotFound();
20836}
20837
Tony Barbour626994c2017-02-08 15:29:37 -070020838TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020839 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020840
20841 m_errorMonitor->ExpectSuccess();
20842
Tony Barbour1fa09702017-03-16 12:09:08 -060020843 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020844 VkCommandBuffer cmd_bufs[4];
20845 VkCommandBufferAllocateInfo alloc_info;
20846 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20847 alloc_info.pNext = NULL;
20848 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020849 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020850 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20851 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20852 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020853 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020854 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20855 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020856 ASSERT_TRUE(image.initialized());
20857 VkCommandBufferBeginInfo cb_binfo;
20858 cb_binfo.pNext = NULL;
20859 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20860 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20861 cb_binfo.flags = 0;
20862 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20863 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20864 VkImageMemoryBarrier img_barrier = {};
20865 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20866 img_barrier.pNext = NULL;
20867 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20868 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20869 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20870 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20871 img_barrier.image = image.handle();
20872 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20873 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20874 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20875 img_barrier.subresourceRange.baseArrayLayer = 0;
20876 img_barrier.subresourceRange.baseMipLevel = 0;
20877 img_barrier.subresourceRange.layerCount = 1;
20878 img_barrier.subresourceRange.levelCount = 1;
20879 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20880 &img_barrier);
20881 vkEndCommandBuffer(cmd_bufs[0]);
20882 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20883 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20884 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20885 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20886 &img_barrier);
20887 vkEndCommandBuffer(cmd_bufs[1]);
20888 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20889 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20890 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20891 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20892 &img_barrier);
20893 vkEndCommandBuffer(cmd_bufs[2]);
20894 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20895 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20896 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20897 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20898 &img_barrier);
20899 vkEndCommandBuffer(cmd_bufs[3]);
20900
20901 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20902 VkSemaphore semaphore1, semaphore2;
20903 VkSemaphoreCreateInfo semaphore_create_info{};
20904 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20905 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20906 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20907 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20908 VkSubmitInfo submit_info[3];
20909 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20910 submit_info[0].pNext = nullptr;
20911 submit_info[0].commandBufferCount = 1;
20912 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20913 submit_info[0].signalSemaphoreCount = 1;
20914 submit_info[0].pSignalSemaphores = &semaphore1;
20915 submit_info[0].waitSemaphoreCount = 0;
20916 submit_info[0].pWaitDstStageMask = nullptr;
20917 submit_info[0].pWaitDstStageMask = flags;
20918 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20919 submit_info[1].pNext = nullptr;
20920 submit_info[1].commandBufferCount = 1;
20921 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20922 submit_info[1].waitSemaphoreCount = 1;
20923 submit_info[1].pWaitSemaphores = &semaphore1;
20924 submit_info[1].signalSemaphoreCount = 1;
20925 submit_info[1].pSignalSemaphores = &semaphore2;
20926 submit_info[1].pWaitDstStageMask = flags;
20927 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20928 submit_info[2].pNext = nullptr;
20929 submit_info[2].commandBufferCount = 2;
20930 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20931 submit_info[2].waitSemaphoreCount = 1;
20932 submit_info[2].pWaitSemaphores = &semaphore2;
20933 submit_info[2].signalSemaphoreCount = 0;
20934 submit_info[2].pSignalSemaphores = nullptr;
20935 submit_info[2].pWaitDstStageMask = flags;
20936 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20937 vkQueueWaitIdle(m_device->m_queue);
20938
20939 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20940 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20941 m_errorMonitor->VerifyNotFound();
20942}
20943
Tobin Ehlis953e8392016-11-17 10:54:13 -070020944TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20945 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20946 // We previously had a bug where dynamic offset of inactive bindings was still being used
20947 VkResult err;
20948 m_errorMonitor->ExpectSuccess();
20949
Tony Barbour1fa09702017-03-16 12:09:08 -060020950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020951 ASSERT_NO_FATAL_FAILURE(InitViewport());
20952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20953
20954 VkDescriptorPoolSize ds_type_count = {};
20955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20956 ds_type_count.descriptorCount = 3;
20957
20958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20960 ds_pool_ci.pNext = NULL;
20961 ds_pool_ci.maxSets = 1;
20962 ds_pool_ci.poolSizeCount = 1;
20963 ds_pool_ci.pPoolSizes = &ds_type_count;
20964
20965 VkDescriptorPool ds_pool;
20966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20967 ASSERT_VK_SUCCESS(err);
20968
20969 const uint32_t BINDING_COUNT = 3;
20970 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020971 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020972 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20973 dsl_binding[0].descriptorCount = 1;
20974 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20975 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020976 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020977 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20978 dsl_binding[1].descriptorCount = 1;
20979 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20980 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020981 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020982 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20983 dsl_binding[2].descriptorCount = 1;
20984 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20985 dsl_binding[2].pImmutableSamplers = NULL;
20986
20987 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20988 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20989 ds_layout_ci.pNext = NULL;
20990 ds_layout_ci.bindingCount = BINDING_COUNT;
20991 ds_layout_ci.pBindings = dsl_binding;
20992 VkDescriptorSetLayout ds_layout;
20993 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20994 ASSERT_VK_SUCCESS(err);
20995
20996 VkDescriptorSet descriptor_set;
20997 VkDescriptorSetAllocateInfo alloc_info = {};
20998 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20999 alloc_info.descriptorSetCount = 1;
21000 alloc_info.descriptorPool = ds_pool;
21001 alloc_info.pSetLayouts = &ds_layout;
21002 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
21003 ASSERT_VK_SUCCESS(err);
21004
21005 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21006 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21007 pipeline_layout_ci.pNext = NULL;
21008 pipeline_layout_ci.setLayoutCount = 1;
21009 pipeline_layout_ci.pSetLayouts = &ds_layout;
21010
21011 VkPipelineLayout pipeline_layout;
21012 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21013 ASSERT_VK_SUCCESS(err);
21014
21015 // Create two buffers to update the descriptors with
21016 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
21017 uint32_t qfi = 0;
21018 VkBufferCreateInfo buffCI = {};
21019 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21020 buffCI.size = 2048;
21021 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
21022 buffCI.queueFamilyIndexCount = 1;
21023 buffCI.pQueueFamilyIndices = &qfi;
21024
21025 VkBuffer dyub1;
21026 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
21027 ASSERT_VK_SUCCESS(err);
21028 // buffer2
21029 buffCI.size = 1024;
21030 VkBuffer dyub2;
21031 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
21032 ASSERT_VK_SUCCESS(err);
21033 // Allocate memory and bind to buffers
21034 VkMemoryAllocateInfo mem_alloc[2] = {};
21035 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21036 mem_alloc[0].pNext = NULL;
21037 mem_alloc[0].memoryTypeIndex = 0;
21038 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21039 mem_alloc[1].pNext = NULL;
21040 mem_alloc[1].memoryTypeIndex = 0;
21041
21042 VkMemoryRequirements mem_reqs1;
21043 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
21044 VkMemoryRequirements mem_reqs2;
21045 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
21046 mem_alloc[0].allocationSize = mem_reqs1.size;
21047 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
21048 mem_alloc[1].allocationSize = mem_reqs2.size;
21049 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
21050 if (!pass) {
21051 vkDestroyBuffer(m_device->device(), dyub1, NULL);
21052 vkDestroyBuffer(m_device->device(), dyub2, NULL);
21053 return;
21054 }
21055
21056 VkDeviceMemory mem1;
21057 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
21058 ASSERT_VK_SUCCESS(err);
21059 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
21060 ASSERT_VK_SUCCESS(err);
21061 VkDeviceMemory mem2;
21062 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
21063 ASSERT_VK_SUCCESS(err);
21064 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
21065 ASSERT_VK_SUCCESS(err);
21066 // Update descriptors
21067 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
21068 buff_info[0].buffer = dyub1;
21069 buff_info[0].offset = 0;
21070 buff_info[0].range = 256;
21071 buff_info[1].buffer = dyub1;
21072 buff_info[1].offset = 256;
21073 buff_info[1].range = 512;
21074 buff_info[2].buffer = dyub2;
21075 buff_info[2].offset = 0;
21076 buff_info[2].range = 512;
21077
21078 VkWriteDescriptorSet descriptor_write;
21079 memset(&descriptor_write, 0, sizeof(descriptor_write));
21080 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
21081 descriptor_write.dstSet = descriptor_set;
21082 descriptor_write.dstBinding = 0;
21083 descriptor_write.descriptorCount = BINDING_COUNT;
21084 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
21085 descriptor_write.pBufferInfo = buff_info;
21086
21087 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
21088
Tony Barbour552f6c02016-12-21 14:34:07 -070021089 m_commandBuffer->BeginCommandBuffer();
21090 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070021091
21092 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021093 char const *vsSource =
21094 "#version 450\n"
21095 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021096 "void main(){\n"
21097 " gl_Position = vec4(1);\n"
21098 "}\n";
21099 char const *fsSource =
21100 "#version 450\n"
21101 "\n"
21102 "layout(location=0) out vec4 x;\n"
21103 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
21104 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
21105 "void main(){\n"
21106 " x = vec4(bar1.y) + vec4(bar2.y);\n"
21107 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070021108 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21109 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21110 VkPipelineObj pipe(m_device);
21111 pipe.SetViewport(m_viewports);
21112 pipe.SetScissor(m_scissors);
21113 pipe.AddShader(&vs);
21114 pipe.AddShader(&fs);
21115 pipe.AddColorAttachment();
21116 pipe.CreateVKPipeline(pipeline_layout, renderPass());
21117
21118 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
21119 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
21120 // we used to have a bug in this case.
21121 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
21122 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
21123 &descriptor_set, BINDING_COUNT, dyn_off);
21124 Draw(1, 0, 0, 0);
21125 m_errorMonitor->VerifyNotFound();
21126
21127 vkDestroyBuffer(m_device->device(), dyub1, NULL);
21128 vkDestroyBuffer(m_device->device(), dyub2, NULL);
21129 vkFreeMemory(m_device->device(), mem1, NULL);
21130 vkFreeMemory(m_device->device(), mem2, NULL);
21131
21132 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21133 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
21134 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
21135}
21136
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021137TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021138 TEST_DESCRIPTION(
21139 "Ensure that validations handling of non-coherent memory "
21140 "mapping while using VK_WHOLE_SIZE does not cause access "
21141 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021142 VkResult err;
21143 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060021144 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021145
21146 VkDeviceMemory mem;
21147 VkMemoryRequirements mem_reqs;
21148 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021149 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021150 VkMemoryAllocateInfo alloc_info = {};
21151 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21152 alloc_info.pNext = NULL;
21153 alloc_info.memoryTypeIndex = 0;
21154
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021155 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021156 alloc_info.allocationSize = allocation_size;
21157
21158 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
21159 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 -070021160 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021161 if (!pass) {
21162 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021163 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
21164 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021165 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021166 pass = m_device->phy().set_memory_type(
21167 mem_reqs.memoryTypeBits, &alloc_info,
21168 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
21169 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021170 if (!pass) {
21171 return;
21172 }
21173 }
21174 }
21175
21176 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
21177 ASSERT_VK_SUCCESS(err);
21178
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021179 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021180 m_errorMonitor->ExpectSuccess();
21181 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
21182 ASSERT_VK_SUCCESS(err);
21183 VkMappedMemoryRange mmr = {};
21184 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
21185 mmr.memory = mem;
21186 mmr.offset = 0;
21187 mmr.size = VK_WHOLE_SIZE;
21188 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
21189 ASSERT_VK_SUCCESS(err);
21190 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
21191 ASSERT_VK_SUCCESS(err);
21192 m_errorMonitor->VerifyNotFound();
21193 vkUnmapMemory(m_device->device(), mem);
21194
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021195 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021196 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021197 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021198 ASSERT_VK_SUCCESS(err);
21199 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
21200 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021201 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021202 mmr.size = VK_WHOLE_SIZE;
21203 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
21204 ASSERT_VK_SUCCESS(err);
21205 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
21206 ASSERT_VK_SUCCESS(err);
21207 m_errorMonitor->VerifyNotFound();
21208 vkUnmapMemory(m_device->device(), mem);
21209
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021210 // Map with offset and size
21211 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021212 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021213 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021214 ASSERT_VK_SUCCESS(err);
21215 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
21216 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021217 mmr.offset = 4 * atom_size;
21218 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021219 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
21220 ASSERT_VK_SUCCESS(err);
21221 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
21222 ASSERT_VK_SUCCESS(err);
21223 m_errorMonitor->VerifyNotFound();
21224 vkUnmapMemory(m_device->device(), mem);
21225
21226 // Map without offset and flush WHOLE_SIZE with two separate offsets
21227 m_errorMonitor->ExpectSuccess();
21228 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
21229 ASSERT_VK_SUCCESS(err);
21230 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
21231 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021232 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021233 mmr.size = VK_WHOLE_SIZE;
21234 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
21235 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070021236 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021237 mmr.size = VK_WHOLE_SIZE;
21238 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
21239 ASSERT_VK_SUCCESS(err);
21240 m_errorMonitor->VerifyNotFound();
21241 vkUnmapMemory(m_device->device(), mem);
21242
21243 vkFreeMemory(m_device->device(), mem, NULL);
21244}
21245
21246// This is a positive test. We used to expect error in this case but spec now allows it
21247TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
21248 m_errorMonitor->ExpectSuccess();
21249 vk_testing::Fence testFence;
21250 VkFenceCreateInfo fenceInfo = {};
21251 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21252 fenceInfo.pNext = NULL;
21253
Tony Barbour1fa09702017-03-16 12:09:08 -060021254 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021255 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021256 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021257 VkResult result = vkResetFences(m_device->device(), 1, fences);
21258 ASSERT_VK_SUCCESS(result);
21259
21260 m_errorMonitor->VerifyNotFound();
21261}
21262
21263TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
21264 m_errorMonitor->ExpectSuccess();
21265
Tony Barbour1fa09702017-03-16 12:09:08 -060021266 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021267 VkResult err;
21268
21269 // Record (empty!) command buffer that can be submitted multiple times
21270 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021271 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
21272 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021273 m_commandBuffer->BeginCommandBuffer(&cbbi);
21274 m_commandBuffer->EndCommandBuffer();
21275
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021276 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021277 VkFence fence;
21278 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
21279 ASSERT_VK_SUCCESS(err);
21280
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021281 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021282 VkSemaphore s1, s2;
21283 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
21284 ASSERT_VK_SUCCESS(err);
21285 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
21286 ASSERT_VK_SUCCESS(err);
21287
21288 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021289 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021290 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
21291 ASSERT_VK_SUCCESS(err);
21292
21293 // Submit CB again, signaling s2.
21294 si.pSignalSemaphores = &s2;
21295 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
21296 ASSERT_VK_SUCCESS(err);
21297
21298 // Wait for fence.
21299 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21300 ASSERT_VK_SUCCESS(err);
21301
21302 // CB is still in flight from second submission, but semaphore s1 is no
21303 // longer in flight. delete it.
21304 vkDestroySemaphore(m_device->device(), s1, nullptr);
21305
21306 m_errorMonitor->VerifyNotFound();
21307
21308 // Force device idle and clean up remaining objects
21309 vkDeviceWaitIdle(m_device->device());
21310 vkDestroySemaphore(m_device->device(), s2, nullptr);
21311 vkDestroyFence(m_device->device(), fence, nullptr);
21312}
21313
21314TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
21315 m_errorMonitor->ExpectSuccess();
21316
Tony Barbour1fa09702017-03-16 12:09:08 -060021317 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021318 VkResult err;
21319
21320 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021321 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021322 VkFence f1;
21323 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
21324 ASSERT_VK_SUCCESS(err);
21325
21326 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021327 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021328 VkFence f2;
21329 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
21330 ASSERT_VK_SUCCESS(err);
21331
21332 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021333 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021334 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
21335
21336 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021337 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021338 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
21339
21340 // Should have both retired!
21341 vkDestroyFence(m_device->device(), f1, nullptr);
21342 vkDestroyFence(m_device->device(), f2, nullptr);
21343
21344 m_errorMonitor->VerifyNotFound();
21345}
21346
21347TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021348 TEST_DESCRIPTION(
21349 "Verify that creating an image view from an image with valid usage "
21350 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021351
Tony Barbour1fa09702017-03-16 12:09:08 -060021352 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021353
21354 m_errorMonitor->ExpectSuccess();
21355 // Verify that we can create a view with usage INPUT_ATTACHMENT
21356 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021357 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 -060021358 ASSERT_TRUE(image.initialized());
21359 VkImageView imageView;
21360 VkImageViewCreateInfo ivci = {};
21361 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
21362 ivci.image = image.handle();
21363 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
21364 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
21365 ivci.subresourceRange.layerCount = 1;
21366 ivci.subresourceRange.baseMipLevel = 0;
21367 ivci.subresourceRange.levelCount = 1;
21368 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21369
21370 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
21371 m_errorMonitor->VerifyNotFound();
21372 vkDestroyImageView(m_device->device(), imageView, NULL);
21373}
21374
21375// This is a positive test. No failures are expected.
21376TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021377 TEST_DESCRIPTION(
21378 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
21379 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021380
Tony Barbour1fa09702017-03-16 12:09:08 -060021381 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021382
21383 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021384 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060021385 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021386
21387 m_errorMonitor->ExpectSuccess();
21388
21389 VkImage image;
21390 VkImageCreateInfo image_create_info = {};
21391 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
21392 image_create_info.pNext = NULL;
21393 image_create_info.imageType = VK_IMAGE_TYPE_2D;
21394 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
21395 image_create_info.extent.width = 64;
21396 image_create_info.extent.height = 64;
21397 image_create_info.extent.depth = 1;
21398 image_create_info.mipLevels = 1;
21399 image_create_info.arrayLayers = 1;
21400 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
21401 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
21402 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
21403 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
21404 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
21405 ASSERT_VK_SUCCESS(err);
21406
21407 VkMemoryRequirements memory_reqs;
21408 VkDeviceMemory memory_one, memory_two;
21409 bool pass;
21410 VkMemoryAllocateInfo memory_info = {};
21411 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21412 memory_info.pNext = NULL;
21413 memory_info.allocationSize = 0;
21414 memory_info.memoryTypeIndex = 0;
21415 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21416 // Find an image big enough to allow sparse mapping of 2 memory regions
21417 // Increase the image size until it is at least twice the
21418 // size of the required alignment, to ensure we can bind both
21419 // allocated memory blocks to the image on aligned offsets.
21420 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
21421 vkDestroyImage(m_device->device(), image, nullptr);
21422 image_create_info.extent.width *= 2;
21423 image_create_info.extent.height *= 2;
21424 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
21425 ASSERT_VK_SUCCESS(err);
21426 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21427 }
21428 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
21429 // at the end of the first
21430 memory_info.allocationSize = memory_reqs.alignment;
21431 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21432 ASSERT_TRUE(pass);
21433 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
21434 ASSERT_VK_SUCCESS(err);
21435 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
21436 ASSERT_VK_SUCCESS(err);
21437 VkSparseMemoryBind binds[2];
21438 binds[0].flags = 0;
21439 binds[0].memory = memory_one;
21440 binds[0].memoryOffset = 0;
21441 binds[0].resourceOffset = 0;
21442 binds[0].size = memory_info.allocationSize;
21443 binds[1].flags = 0;
21444 binds[1].memory = memory_two;
21445 binds[1].memoryOffset = 0;
21446 binds[1].resourceOffset = memory_info.allocationSize;
21447 binds[1].size = memory_info.allocationSize;
21448
21449 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
21450 opaqueBindInfo.image = image;
21451 opaqueBindInfo.bindCount = 2;
21452 opaqueBindInfo.pBinds = binds;
21453
21454 VkFence fence = VK_NULL_HANDLE;
21455 VkBindSparseInfo bindSparseInfo = {};
21456 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
21457 bindSparseInfo.imageOpaqueBindCount = 1;
21458 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
21459
21460 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
21461 vkQueueWaitIdle(m_device->m_queue);
21462 vkDestroyImage(m_device->device(), image, NULL);
21463 vkFreeMemory(m_device->device(), memory_one, NULL);
21464 vkFreeMemory(m_device->device(), memory_two, NULL);
21465 m_errorMonitor->VerifyNotFound();
21466}
21467
21468TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021469 TEST_DESCRIPTION(
21470 "Ensure that CmdBeginRenderPass with an attachment's "
21471 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
21472 "the command buffer has prior knowledge of that "
21473 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021474
21475 m_errorMonitor->ExpectSuccess();
21476
Tony Barbour1fa09702017-03-16 12:09:08 -060021477 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021478
21479 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021480 VkAttachmentDescription attachment = {0,
21481 VK_FORMAT_R8G8B8A8_UNORM,
21482 VK_SAMPLE_COUNT_1_BIT,
21483 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21484 VK_ATTACHMENT_STORE_OP_STORE,
21485 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21486 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21487 VK_IMAGE_LAYOUT_UNDEFINED,
21488 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021489
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021490 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021491
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021492 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021494 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021495
21496 VkRenderPass rp;
21497 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21498 ASSERT_VK_SUCCESS(err);
21499
21500 // A compatible framebuffer.
21501 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021502 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 -060021503 ASSERT_TRUE(image.initialized());
21504
21505 VkImageViewCreateInfo ivci = {
21506 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21507 nullptr,
21508 0,
21509 image.handle(),
21510 VK_IMAGE_VIEW_TYPE_2D,
21511 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021512 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21513 VK_COMPONENT_SWIZZLE_IDENTITY},
21514 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021515 };
21516 VkImageView view;
21517 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21518 ASSERT_VK_SUCCESS(err);
21519
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021520 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021521 VkFramebuffer fb;
21522 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21523 ASSERT_VK_SUCCESS(err);
21524
21525 // Record a single command buffer which uses this renderpass twice. The
21526 // bug is triggered at the beginning of the second renderpass, when the
21527 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021528 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 -070021529 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021530 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21531 vkCmdEndRenderPass(m_commandBuffer->handle());
21532 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21533
21534 m_errorMonitor->VerifyNotFound();
21535
21536 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021537 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021538
21539 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21540 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21541 vkDestroyImageView(m_device->device(), view, nullptr);
21542}
21543
21544TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021545 TEST_DESCRIPTION(
21546 "This test should pass. Create a Framebuffer and "
21547 "command buffer, bind them together, then destroy "
21548 "command pool and framebuffer and verify there are no "
21549 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021550
21551 m_errorMonitor->ExpectSuccess();
21552
Tony Barbour1fa09702017-03-16 12:09:08 -060021553 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021554
21555 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021556 VkAttachmentDescription attachment = {0,
21557 VK_FORMAT_R8G8B8A8_UNORM,
21558 VK_SAMPLE_COUNT_1_BIT,
21559 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21560 VK_ATTACHMENT_STORE_OP_STORE,
21561 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21562 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21563 VK_IMAGE_LAYOUT_UNDEFINED,
21564 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021565
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021566 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021567
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021568 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021569
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021570 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021571
21572 VkRenderPass rp;
21573 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21574 ASSERT_VK_SUCCESS(err);
21575
21576 // A compatible framebuffer.
21577 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021578 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 -060021579 ASSERT_TRUE(image.initialized());
21580
21581 VkImageViewCreateInfo ivci = {
21582 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21583 nullptr,
21584 0,
21585 image.handle(),
21586 VK_IMAGE_VIEW_TYPE_2D,
21587 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021588 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21589 VK_COMPONENT_SWIZZLE_IDENTITY},
21590 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021591 };
21592 VkImageView view;
21593 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21594 ASSERT_VK_SUCCESS(err);
21595
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021596 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021597 VkFramebuffer fb;
21598 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21599 ASSERT_VK_SUCCESS(err);
21600
21601 // Explicitly create a command buffer to bind the FB to so that we can then
21602 // destroy the command pool in order to implicitly free command buffer
21603 VkCommandPool command_pool;
21604 VkCommandPoolCreateInfo pool_create_info{};
21605 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21606 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21607 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21608 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21609
21610 VkCommandBuffer command_buffer;
21611 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21612 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21613 command_buffer_allocate_info.commandPool = command_pool;
21614 command_buffer_allocate_info.commandBufferCount = 1;
21615 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21616 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21617
21618 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021619 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 -060021620 VkCommandBufferBeginInfo begin_info{};
21621 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21622 vkBeginCommandBuffer(command_buffer, &begin_info);
21623
21624 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21625 vkCmdEndRenderPass(command_buffer);
21626 vkEndCommandBuffer(command_buffer);
21627 vkDestroyImageView(m_device->device(), view, nullptr);
21628 // Destroy command pool to implicitly free command buffer
21629 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21630 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21631 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21632 m_errorMonitor->VerifyNotFound();
21633}
21634
21635TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021636 TEST_DESCRIPTION(
21637 "Ensure that CmdBeginRenderPass applies the layout "
21638 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021639
21640 m_errorMonitor->ExpectSuccess();
21641
Tony Barbour1fa09702017-03-16 12:09:08 -060021642 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021643
21644 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021645 VkAttachmentDescription attachment = {0,
21646 VK_FORMAT_R8G8B8A8_UNORM,
21647 VK_SAMPLE_COUNT_1_BIT,
21648 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21649 VK_ATTACHMENT_STORE_OP_STORE,
21650 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21651 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21652 VK_IMAGE_LAYOUT_UNDEFINED,
21653 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021654
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021655 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021656
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021657 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021658
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021659 VkSubpassDependency dep = {0,
21660 0,
21661 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21662 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21663 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21664 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21665 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021666
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021667 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021668
21669 VkResult err;
21670 VkRenderPass rp;
21671 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21672 ASSERT_VK_SUCCESS(err);
21673
21674 // A compatible framebuffer.
21675 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021676 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 -060021677 ASSERT_TRUE(image.initialized());
21678
21679 VkImageViewCreateInfo ivci = {
21680 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21681 nullptr,
21682 0,
21683 image.handle(),
21684 VK_IMAGE_VIEW_TYPE_2D,
21685 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021686 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21687 VK_COMPONENT_SWIZZLE_IDENTITY},
21688 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021689 };
21690 VkImageView view;
21691 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21692 ASSERT_VK_SUCCESS(err);
21693
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021694 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021695 VkFramebuffer fb;
21696 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21697 ASSERT_VK_SUCCESS(err);
21698
21699 // Record a single command buffer which issues a pipeline barrier w/
21700 // image memory barrier for the attachment. This detects the previously
21701 // missing tracking of the subpass layout by throwing a validation error
21702 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021703 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 -070021704 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021705 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21706
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021707 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21708 nullptr,
21709 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21710 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21711 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21712 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21713 VK_QUEUE_FAMILY_IGNORED,
21714 VK_QUEUE_FAMILY_IGNORED,
21715 image.handle(),
21716 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021717 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021718 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21719 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021720
21721 vkCmdEndRenderPass(m_commandBuffer->handle());
21722 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021723 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021724
21725 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21726 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21727 vkDestroyImageView(m_device->device(), view, nullptr);
21728}
21729
21730TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021731 TEST_DESCRIPTION(
21732 "Validate that when an imageView of a depth/stencil image "
21733 "is used as a depth/stencil framebuffer attachment, the "
21734 "aspectMask is ignored and both depth and stencil image "
21735 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021736
Tony Barbour1fa09702017-03-16 12:09:08 -060021737 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021738 VkFormatProperties format_properties;
21739 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21740 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21741 return;
21742 }
21743
21744 m_errorMonitor->ExpectSuccess();
21745
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021746 VkAttachmentDescription attachment = {0,
21747 VK_FORMAT_D32_SFLOAT_S8_UINT,
21748 VK_SAMPLE_COUNT_1_BIT,
21749 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21750 VK_ATTACHMENT_STORE_OP_STORE,
21751 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21752 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21753 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21754 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021755
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021756 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021757
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021758 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021759
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021760 VkSubpassDependency dep = {0,
21761 0,
21762 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21763 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21764 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21765 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21766 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021767
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021769
21770 VkResult err;
21771 VkRenderPass rp;
21772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21773 ASSERT_VK_SUCCESS(err);
21774
21775 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021776 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21777 0x26, // usage
21778 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021779 ASSERT_TRUE(image.initialized());
21780 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21781
21782 VkImageViewCreateInfo ivci = {
21783 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21784 nullptr,
21785 0,
21786 image.handle(),
21787 VK_IMAGE_VIEW_TYPE_2D,
21788 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021789 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21790 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021791 };
21792 VkImageView view;
21793 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21794 ASSERT_VK_SUCCESS(err);
21795
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021796 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021797 VkFramebuffer fb;
21798 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21799 ASSERT_VK_SUCCESS(err);
21800
Tony Barbour552f6c02016-12-21 14:34:07 -070021801 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021802
21803 VkImageMemoryBarrier imb = {};
21804 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21805 imb.pNext = nullptr;
21806 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21807 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21808 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21809 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21810 imb.srcQueueFamilyIndex = 0;
21811 imb.dstQueueFamilyIndex = 0;
21812 imb.image = image.handle();
21813 imb.subresourceRange.aspectMask = 0x6;
21814 imb.subresourceRange.baseMipLevel = 0;
21815 imb.subresourceRange.levelCount = 0x1;
21816 imb.subresourceRange.baseArrayLayer = 0;
21817 imb.subresourceRange.layerCount = 0x1;
21818
21819 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021820 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21821 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021822
Tony Barbour552f6c02016-12-21 14:34:07 -070021823 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021824 QueueCommandBuffer(false);
21825 m_errorMonitor->VerifyNotFound();
21826
21827 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21828 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21829 vkDestroyImageView(m_device->device(), view, nullptr);
21830}
21831
21832TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021833 TEST_DESCRIPTION(
21834 "Ensure that layout transitions work correctly without "
21835 "errors, when an attachment reference is "
21836 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021837
21838 m_errorMonitor->ExpectSuccess();
21839
Tony Barbour1fa09702017-03-16 12:09:08 -060021840 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021841
21842 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021843 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021844
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021845 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021846
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021847 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021848
21849 VkRenderPass rp;
21850 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21851 ASSERT_VK_SUCCESS(err);
21852
21853 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021854 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021855 VkFramebuffer fb;
21856 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21857 ASSERT_VK_SUCCESS(err);
21858
21859 // Record a command buffer which just begins and ends the renderpass. The
21860 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021861 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 -070021862 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021863 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21864 vkCmdEndRenderPass(m_commandBuffer->handle());
21865 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021866 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021867
21868 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21869 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21870}
21871
21872// This is a positive test. No errors are expected.
21873TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021874 TEST_DESCRIPTION(
21875 "Create a stencil-only attachment with a LOAD_OP set to "
21876 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021877 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021878 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021879 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021880 if (!depth_format) {
21881 printf(" No Depth + Stencil format found. Skipped.\n");
21882 return;
21883 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021884 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021885 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021886 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21887 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021888 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21889 return;
21890 }
21891
Tony Barbourf887b162017-03-09 10:06:46 -070021892 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021893 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021894 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021895 VkAttachmentDescription att = {};
21896 VkAttachmentReference ref = {};
21897 att.format = depth_stencil_fmt;
21898 att.samples = VK_SAMPLE_COUNT_1_BIT;
21899 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21900 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21901 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21902 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21903 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21904 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21905
21906 VkClearValue clear;
21907 clear.depthStencil.depth = 1.0;
21908 clear.depthStencil.stencil = 0;
21909 ref.attachment = 0;
21910 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21911
21912 VkSubpassDescription subpass = {};
21913 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21914 subpass.flags = 0;
21915 subpass.inputAttachmentCount = 0;
21916 subpass.pInputAttachments = NULL;
21917 subpass.colorAttachmentCount = 0;
21918 subpass.pColorAttachments = NULL;
21919 subpass.pResolveAttachments = NULL;
21920 subpass.pDepthStencilAttachment = &ref;
21921 subpass.preserveAttachmentCount = 0;
21922 subpass.pPreserveAttachments = NULL;
21923
21924 VkRenderPass rp;
21925 VkRenderPassCreateInfo rp_info = {};
21926 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21927 rp_info.attachmentCount = 1;
21928 rp_info.pAttachments = &att;
21929 rp_info.subpassCount = 1;
21930 rp_info.pSubpasses = &subpass;
21931 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21932 ASSERT_VK_SUCCESS(result);
21933
21934 VkImageView *depthView = m_depthStencil->BindInfo();
21935 VkFramebufferCreateInfo fb_info = {};
21936 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21937 fb_info.pNext = NULL;
21938 fb_info.renderPass = rp;
21939 fb_info.attachmentCount = 1;
21940 fb_info.pAttachments = depthView;
21941 fb_info.width = 100;
21942 fb_info.height = 100;
21943 fb_info.layers = 1;
21944 VkFramebuffer fb;
21945 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21946 ASSERT_VK_SUCCESS(result);
21947
21948 VkRenderPassBeginInfo rpbinfo = {};
21949 rpbinfo.clearValueCount = 1;
21950 rpbinfo.pClearValues = &clear;
21951 rpbinfo.pNext = NULL;
21952 rpbinfo.renderPass = rp;
21953 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21954 rpbinfo.renderArea.extent.width = 100;
21955 rpbinfo.renderArea.extent.height = 100;
21956 rpbinfo.renderArea.offset.x = 0;
21957 rpbinfo.renderArea.offset.y = 0;
21958 rpbinfo.framebuffer = fb;
21959
21960 VkFence fence = {};
21961 VkFenceCreateInfo fence_ci = {};
21962 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21963 fence_ci.pNext = nullptr;
21964 fence_ci.flags = 0;
21965 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21966 ASSERT_VK_SUCCESS(result);
21967
21968 m_commandBuffer->BeginCommandBuffer();
21969 m_commandBuffer->BeginRenderPass(rpbinfo);
21970 m_commandBuffer->EndRenderPass();
21971 m_commandBuffer->EndCommandBuffer();
21972 m_commandBuffer->QueueCommandBuffer(fence);
21973
21974 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021975 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 -070021976 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021977 VkImageMemoryBarrier barrier = {};
21978 VkImageSubresourceRange range;
21979 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21980 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21981 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21982 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21983 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21984 barrier.image = m_depthStencil->handle();
21985 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21986 range.baseMipLevel = 0;
21987 range.levelCount = 1;
21988 range.baseArrayLayer = 0;
21989 range.layerCount = 1;
21990 barrier.subresourceRange = range;
21991 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21992 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21993 cmdbuf.BeginCommandBuffer();
21994 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 -070021995 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021996 barrier.srcAccessMask = 0;
21997 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21998 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21999 barrier.image = destImage.handle();
22000 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
22001 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 -070022002 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022003 VkImageCopy cregion;
22004 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
22005 cregion.srcSubresource.mipLevel = 0;
22006 cregion.srcSubresource.baseArrayLayer = 0;
22007 cregion.srcSubresource.layerCount = 1;
22008 cregion.srcOffset.x = 0;
22009 cregion.srcOffset.y = 0;
22010 cregion.srcOffset.z = 0;
22011 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
22012 cregion.dstSubresource.mipLevel = 0;
22013 cregion.dstSubresource.baseArrayLayer = 0;
22014 cregion.dstSubresource.layerCount = 1;
22015 cregion.dstOffset.x = 0;
22016 cregion.dstOffset.y = 0;
22017 cregion.dstOffset.z = 0;
22018 cregion.extent.width = 100;
22019 cregion.extent.height = 100;
22020 cregion.extent.depth = 1;
22021 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022022 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022023 cmdbuf.EndCommandBuffer();
22024
22025 VkSubmitInfo submit_info;
22026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22027 submit_info.pNext = NULL;
22028 submit_info.waitSemaphoreCount = 0;
22029 submit_info.pWaitSemaphores = NULL;
22030 submit_info.pWaitDstStageMask = NULL;
22031 submit_info.commandBufferCount = 1;
22032 submit_info.pCommandBuffers = &cmdbuf.handle();
22033 submit_info.signalSemaphoreCount = 0;
22034 submit_info.pSignalSemaphores = NULL;
22035
22036 m_errorMonitor->ExpectSuccess();
22037 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22038 m_errorMonitor->VerifyNotFound();
22039
22040 vkQueueWaitIdle(m_device->m_queue);
22041 vkDestroyFence(m_device->device(), fence, nullptr);
22042 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22043 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
22044}
22045
22046// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070022047TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
22048 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
22049
22050 m_errorMonitor->ExpectSuccess();
22051
Tony Barbour1fa09702017-03-16 12:09:08 -060022052 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022053 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060022054 if (!depth_format) {
22055 printf(" No Depth + Stencil format found. Skipped.\n");
22056 return;
22057 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070022058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22059
22060 VkImageMemoryBarrier img_barrier = {};
22061 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
22062 img_barrier.pNext = NULL;
22063 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
22064 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
22065 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
22066 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
22067 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
22068 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
22069 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
22070 img_barrier.subresourceRange.baseArrayLayer = 0;
22071 img_barrier.subresourceRange.baseMipLevel = 0;
22072 img_barrier.subresourceRange.layerCount = 1;
22073 img_barrier.subresourceRange.levelCount = 1;
22074
22075 {
22076 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022077 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 -070022078 ASSERT_TRUE(img_color.initialized());
22079
22080 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022081 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 -070022082 ASSERT_TRUE(img_ds1.initialized());
22083
22084 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022085 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 -070022086 ASSERT_TRUE(img_ds2.initialized());
22087
22088 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022089 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 -070022090 ASSERT_TRUE(img_xfer_src.initialized());
22091
22092 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022093 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 -070022094 ASSERT_TRUE(img_xfer_dst.initialized());
22095
22096 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022097 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 -070022098 ASSERT_TRUE(img_sampled.initialized());
22099
22100 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022101 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 -070022102 ASSERT_TRUE(img_input.initialized());
22103
22104 const struct {
22105 VkImageObj &image_obj;
22106 VkImageLayout old_layout;
22107 VkImageLayout new_layout;
22108 } buffer_layouts[] = {
22109 // clang-format off
22110 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22111 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22112 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22113 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22114 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22115 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22116 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
22117 // clang-format on
22118 };
22119 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
22120
22121 m_commandBuffer->BeginCommandBuffer();
22122 for (uint32_t i = 0; i < layout_count; ++i) {
22123 img_barrier.image = buffer_layouts[i].image_obj.handle();
22124 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
22125 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
22126 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
22127 : VK_IMAGE_ASPECT_COLOR_BIT;
22128
22129 img_barrier.oldLayout = buffer_layouts[i].old_layout;
22130 img_barrier.newLayout = buffer_layouts[i].new_layout;
22131 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
22132 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
22133
22134 img_barrier.oldLayout = buffer_layouts[i].new_layout;
22135 img_barrier.newLayout = buffer_layouts[i].old_layout;
22136 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
22137 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
22138 }
22139 m_commandBuffer->EndCommandBuffer();
22140
22141 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
22142 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
22143 }
22144 m_errorMonitor->VerifyNotFound();
22145}
22146
22147// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022148TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
22149 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
22150
22151 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022152 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022153
22154 VkEvent event;
22155 VkEventCreateInfo event_create_info{};
22156 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
22157 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
22158
22159 VkCommandPool command_pool;
22160 VkCommandPoolCreateInfo pool_create_info{};
22161 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22162 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22163 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22164 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22165
22166 VkCommandBuffer command_buffer;
22167 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22168 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22169 command_buffer_allocate_info.commandPool = command_pool;
22170 command_buffer_allocate_info.commandBufferCount = 1;
22171 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22172 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22173
22174 VkQueue queue = VK_NULL_HANDLE;
22175 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22176
22177 {
22178 VkCommandBufferBeginInfo begin_info{};
22179 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22180 vkBeginCommandBuffer(command_buffer, &begin_info);
22181
22182 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 -070022183 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022184 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
22185 vkEndCommandBuffer(command_buffer);
22186 }
22187 {
22188 VkSubmitInfo submit_info{};
22189 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22190 submit_info.commandBufferCount = 1;
22191 submit_info.pCommandBuffers = &command_buffer;
22192 submit_info.signalSemaphoreCount = 0;
22193 submit_info.pSignalSemaphores = nullptr;
22194 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22195 }
22196 { vkSetEvent(m_device->device(), event); }
22197
22198 vkQueueWaitIdle(queue);
22199
22200 vkDestroyEvent(m_device->device(), event, nullptr);
22201 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22202 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22203
22204 m_errorMonitor->VerifyNotFound();
22205}
22206// This is a positive test. No errors should be generated.
22207TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
22208 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
22209
Tony Barbour1fa09702017-03-16 12:09:08 -060022210 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022211 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022212
22213 m_errorMonitor->ExpectSuccess();
22214
22215 VkQueryPool query_pool;
22216 VkQueryPoolCreateInfo query_pool_create_info{};
22217 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
22218 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
22219 query_pool_create_info.queryCount = 1;
22220 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
22221
22222 VkCommandPool command_pool;
22223 VkCommandPoolCreateInfo pool_create_info{};
22224 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22225 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22226 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22227 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22228
22229 VkCommandBuffer command_buffer;
22230 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22231 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22232 command_buffer_allocate_info.commandPool = command_pool;
22233 command_buffer_allocate_info.commandBufferCount = 1;
22234 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22235 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22236
22237 VkCommandBuffer secondary_command_buffer;
22238 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
22239 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
22240
22241 VkQueue queue = VK_NULL_HANDLE;
22242 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22243
22244 uint32_t qfi = 0;
22245 VkBufferCreateInfo buff_create_info = {};
22246 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22247 buff_create_info.size = 1024;
22248 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
22249 buff_create_info.queueFamilyIndexCount = 1;
22250 buff_create_info.pQueueFamilyIndices = &qfi;
22251
22252 VkResult err;
22253 VkBuffer buffer;
22254 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
22255 ASSERT_VK_SUCCESS(err);
22256 VkMemoryAllocateInfo mem_alloc = {};
22257 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22258 mem_alloc.pNext = NULL;
22259 mem_alloc.allocationSize = 1024;
22260 mem_alloc.memoryTypeIndex = 0;
22261
22262 VkMemoryRequirements memReqs;
22263 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
22264 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
22265 if (!pass) {
22266 vkDestroyBuffer(m_device->device(), buffer, NULL);
22267 return;
22268 }
22269
22270 VkDeviceMemory mem;
22271 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
22272 ASSERT_VK_SUCCESS(err);
22273 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
22274 ASSERT_VK_SUCCESS(err);
22275
22276 VkCommandBufferInheritanceInfo hinfo = {};
22277 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
22278 hinfo.renderPass = VK_NULL_HANDLE;
22279 hinfo.subpass = 0;
22280 hinfo.framebuffer = VK_NULL_HANDLE;
22281 hinfo.occlusionQueryEnable = VK_FALSE;
22282 hinfo.queryFlags = 0;
22283 hinfo.pipelineStatistics = 0;
22284
22285 {
22286 VkCommandBufferBeginInfo begin_info{};
22287 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22288 begin_info.pInheritanceInfo = &hinfo;
22289 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
22290
22291 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
22292 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
22293
22294 vkEndCommandBuffer(secondary_command_buffer);
22295
22296 begin_info.pInheritanceInfo = nullptr;
22297 vkBeginCommandBuffer(command_buffer, &begin_info);
22298
22299 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
22300 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
22301
22302 vkEndCommandBuffer(command_buffer);
22303 }
22304 {
22305 VkSubmitInfo submit_info{};
22306 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22307 submit_info.commandBufferCount = 1;
22308 submit_info.pCommandBuffers = &command_buffer;
22309 submit_info.signalSemaphoreCount = 0;
22310 submit_info.pSignalSemaphores = nullptr;
22311 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22312 }
22313
22314 vkQueueWaitIdle(queue);
22315
22316 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
22317 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22318 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
22319 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22320 vkDestroyBuffer(m_device->device(), buffer, NULL);
22321 vkFreeMemory(m_device->device(), mem, NULL);
22322
22323 m_errorMonitor->VerifyNotFound();
22324}
22325
22326// This is a positive test. No errors should be generated.
22327TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
22328 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
22329
Tony Barbour1fa09702017-03-16 12:09:08 -060022330 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022331 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022332
22333 m_errorMonitor->ExpectSuccess();
22334
22335 VkQueryPool query_pool;
22336 VkQueryPoolCreateInfo query_pool_create_info{};
22337 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
22338 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
22339 query_pool_create_info.queryCount = 1;
22340 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
22341
22342 VkCommandPool command_pool;
22343 VkCommandPoolCreateInfo pool_create_info{};
22344 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22345 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22346 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22347 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22348
22349 VkCommandBuffer command_buffer[2];
22350 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22351 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22352 command_buffer_allocate_info.commandPool = command_pool;
22353 command_buffer_allocate_info.commandBufferCount = 2;
22354 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22355 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22356
22357 VkQueue queue = VK_NULL_HANDLE;
22358 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22359
22360 uint32_t qfi = 0;
22361 VkBufferCreateInfo buff_create_info = {};
22362 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22363 buff_create_info.size = 1024;
22364 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
22365 buff_create_info.queueFamilyIndexCount = 1;
22366 buff_create_info.pQueueFamilyIndices = &qfi;
22367
22368 VkResult err;
22369 VkBuffer buffer;
22370 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
22371 ASSERT_VK_SUCCESS(err);
22372 VkMemoryAllocateInfo mem_alloc = {};
22373 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22374 mem_alloc.pNext = NULL;
22375 mem_alloc.allocationSize = 1024;
22376 mem_alloc.memoryTypeIndex = 0;
22377
22378 VkMemoryRequirements memReqs;
22379 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
22380 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
22381 if (!pass) {
22382 vkDestroyBuffer(m_device->device(), buffer, NULL);
22383 return;
22384 }
22385
22386 VkDeviceMemory mem;
22387 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
22388 ASSERT_VK_SUCCESS(err);
22389 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
22390 ASSERT_VK_SUCCESS(err);
22391
22392 {
22393 VkCommandBufferBeginInfo begin_info{};
22394 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22395 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22396
22397 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
22398 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
22399
22400 vkEndCommandBuffer(command_buffer[0]);
22401
22402 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22403
22404 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
22405
22406 vkEndCommandBuffer(command_buffer[1]);
22407 }
22408 {
22409 VkSubmitInfo submit_info{};
22410 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22411 submit_info.commandBufferCount = 2;
22412 submit_info.pCommandBuffers = command_buffer;
22413 submit_info.signalSemaphoreCount = 0;
22414 submit_info.pSignalSemaphores = nullptr;
22415 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22416 }
22417
22418 vkQueueWaitIdle(queue);
22419
22420 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
22421 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
22422 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22423 vkDestroyBuffer(m_device->device(), buffer, NULL);
22424 vkFreeMemory(m_device->device(), mem, NULL);
22425
22426 m_errorMonitor->VerifyNotFound();
22427}
22428
Tony Barbourc46924f2016-11-04 11:49:52 -060022429TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022430 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
22431
Tony Barbour1fa09702017-03-16 12:09:08 -060022432 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022433 VkEvent event;
22434 VkEventCreateInfo event_create_info{};
22435 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
22436 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
22437
22438 VkCommandPool command_pool;
22439 VkCommandPoolCreateInfo pool_create_info{};
22440 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22441 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22442 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22443 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22444
22445 VkCommandBuffer command_buffer;
22446 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22447 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22448 command_buffer_allocate_info.commandPool = command_pool;
22449 command_buffer_allocate_info.commandBufferCount = 1;
22450 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22451 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22452
22453 VkQueue queue = VK_NULL_HANDLE;
22454 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22455
22456 {
22457 VkCommandBufferBeginInfo begin_info{};
22458 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22459 vkBeginCommandBuffer(command_buffer, &begin_info);
22460
22461 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022462 vkEndCommandBuffer(command_buffer);
22463 }
22464 {
22465 VkSubmitInfo submit_info{};
22466 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22467 submit_info.commandBufferCount = 1;
22468 submit_info.pCommandBuffers = &command_buffer;
22469 submit_info.signalSemaphoreCount = 0;
22470 submit_info.pSignalSemaphores = nullptr;
22471 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22472 }
22473 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
22475 "that is already in use by a "
22476 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022477 vkSetEvent(m_device->device(), event);
22478 m_errorMonitor->VerifyFound();
22479 }
22480
22481 vkQueueWaitIdle(queue);
22482
22483 vkDestroyEvent(m_device->device(), event, nullptr);
22484 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22485 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22486}
22487
22488// This is a positive test. No errors should be generated.
22489TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022490 TEST_DESCRIPTION(
22491 "Two command buffers with two separate fences are each "
22492 "run through a Submit & WaitForFences cycle 3 times. This "
22493 "previously revealed a bug so running this positive test "
22494 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022495 m_errorMonitor->ExpectSuccess();
22496
Tony Barbour1fa09702017-03-16 12:09:08 -060022497 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022498 VkQueue queue = VK_NULL_HANDLE;
22499 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22500
22501 static const uint32_t NUM_OBJECTS = 2;
22502 static const uint32_t NUM_FRAMES = 3;
22503 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
22504 VkFence fences[NUM_OBJECTS] = {};
22505
22506 VkCommandPool cmd_pool;
22507 VkCommandPoolCreateInfo cmd_pool_ci = {};
22508 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22509 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
22510 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22511 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
22512 ASSERT_VK_SUCCESS(err);
22513
22514 VkCommandBufferAllocateInfo cmd_buf_info = {};
22515 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22516 cmd_buf_info.commandPool = cmd_pool;
22517 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22518 cmd_buf_info.commandBufferCount = 1;
22519
22520 VkFenceCreateInfo fence_ci = {};
22521 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22522 fence_ci.pNext = nullptr;
22523 fence_ci.flags = 0;
22524
22525 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22526 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
22527 ASSERT_VK_SUCCESS(err);
22528 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
22529 ASSERT_VK_SUCCESS(err);
22530 }
22531
22532 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
22533 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22534 // Create empty cmd buffer
22535 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22536 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22537
22538 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22539 ASSERT_VK_SUCCESS(err);
22540 err = vkEndCommandBuffer(cmd_buffers[obj]);
22541 ASSERT_VK_SUCCESS(err);
22542
22543 VkSubmitInfo submit_info = {};
22544 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22545 submit_info.commandBufferCount = 1;
22546 submit_info.pCommandBuffers = &cmd_buffers[obj];
22547 // Submit cmd buffer and wait for fence
22548 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22549 ASSERT_VK_SUCCESS(err);
22550 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22551 ASSERT_VK_SUCCESS(err);
22552 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22553 ASSERT_VK_SUCCESS(err);
22554 }
22555 }
22556 m_errorMonitor->VerifyNotFound();
22557 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22558 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22559 vkDestroyFence(m_device->device(), fences[i], nullptr);
22560 }
22561}
22562// This is a positive test. No errors should be generated.
22563TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022564 TEST_DESCRIPTION(
22565 "Two command buffers, each in a separate QueueSubmit call "
22566 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022567
Tony Barbour1fa09702017-03-16 12:09:08 -060022568 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022569 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022570
22571 m_errorMonitor->ExpectSuccess();
22572
22573 VkSemaphore semaphore;
22574 VkSemaphoreCreateInfo semaphore_create_info{};
22575 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22576 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22577
22578 VkCommandPool command_pool;
22579 VkCommandPoolCreateInfo pool_create_info{};
22580 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22581 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22582 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22583 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22584
22585 VkCommandBuffer command_buffer[2];
22586 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22587 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22588 command_buffer_allocate_info.commandPool = command_pool;
22589 command_buffer_allocate_info.commandBufferCount = 2;
22590 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22591 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22592
22593 VkQueue queue = VK_NULL_HANDLE;
22594 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22595
22596 {
22597 VkCommandBufferBeginInfo begin_info{};
22598 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22599 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22600
22601 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 -070022602 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603
22604 VkViewport viewport{};
22605 viewport.maxDepth = 1.0f;
22606 viewport.minDepth = 0.0f;
22607 viewport.width = 512;
22608 viewport.height = 512;
22609 viewport.x = 0;
22610 viewport.y = 0;
22611 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22612 vkEndCommandBuffer(command_buffer[0]);
22613 }
22614 {
22615 VkCommandBufferBeginInfo begin_info{};
22616 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22617 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22618
22619 VkViewport viewport{};
22620 viewport.maxDepth = 1.0f;
22621 viewport.minDepth = 0.0f;
22622 viewport.width = 512;
22623 viewport.height = 512;
22624 viewport.x = 0;
22625 viewport.y = 0;
22626 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22627 vkEndCommandBuffer(command_buffer[1]);
22628 }
22629 {
22630 VkSubmitInfo submit_info{};
22631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22632 submit_info.commandBufferCount = 1;
22633 submit_info.pCommandBuffers = &command_buffer[0];
22634 submit_info.signalSemaphoreCount = 1;
22635 submit_info.pSignalSemaphores = &semaphore;
22636 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22637 }
22638 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022639 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022640 VkSubmitInfo submit_info{};
22641 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22642 submit_info.commandBufferCount = 1;
22643 submit_info.pCommandBuffers = &command_buffer[1];
22644 submit_info.waitSemaphoreCount = 1;
22645 submit_info.pWaitSemaphores = &semaphore;
22646 submit_info.pWaitDstStageMask = flags;
22647 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22648 }
22649
22650 vkQueueWaitIdle(m_device->m_queue);
22651
22652 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22653 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22654 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22655
22656 m_errorMonitor->VerifyNotFound();
22657}
22658
22659// This is a positive test. No errors should be generated.
22660TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022661 TEST_DESCRIPTION(
22662 "Two command buffers, each in a separate QueueSubmit call "
22663 "submitted on separate queues, the second having a fence"
22664 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022665
Tony Barbour1fa09702017-03-16 12:09:08 -060022666 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022667 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022668
22669 m_errorMonitor->ExpectSuccess();
22670
22671 VkFence fence;
22672 VkFenceCreateInfo fence_create_info{};
22673 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22674 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22675
22676 VkSemaphore semaphore;
22677 VkSemaphoreCreateInfo semaphore_create_info{};
22678 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22679 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22680
22681 VkCommandPool command_pool;
22682 VkCommandPoolCreateInfo pool_create_info{};
22683 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22684 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22685 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22686 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22687
22688 VkCommandBuffer command_buffer[2];
22689 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22690 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22691 command_buffer_allocate_info.commandPool = command_pool;
22692 command_buffer_allocate_info.commandBufferCount = 2;
22693 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22694 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22695
22696 VkQueue queue = VK_NULL_HANDLE;
22697 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22698
22699 {
22700 VkCommandBufferBeginInfo begin_info{};
22701 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22702 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22703
22704 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 -070022705 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706
22707 VkViewport viewport{};
22708 viewport.maxDepth = 1.0f;
22709 viewport.minDepth = 0.0f;
22710 viewport.width = 512;
22711 viewport.height = 512;
22712 viewport.x = 0;
22713 viewport.y = 0;
22714 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22715 vkEndCommandBuffer(command_buffer[0]);
22716 }
22717 {
22718 VkCommandBufferBeginInfo begin_info{};
22719 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22720 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22721
22722 VkViewport viewport{};
22723 viewport.maxDepth = 1.0f;
22724 viewport.minDepth = 0.0f;
22725 viewport.width = 512;
22726 viewport.height = 512;
22727 viewport.x = 0;
22728 viewport.y = 0;
22729 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22730 vkEndCommandBuffer(command_buffer[1]);
22731 }
22732 {
22733 VkSubmitInfo submit_info{};
22734 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22735 submit_info.commandBufferCount = 1;
22736 submit_info.pCommandBuffers = &command_buffer[0];
22737 submit_info.signalSemaphoreCount = 1;
22738 submit_info.pSignalSemaphores = &semaphore;
22739 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22740 }
22741 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022742 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022743 VkSubmitInfo submit_info{};
22744 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22745 submit_info.commandBufferCount = 1;
22746 submit_info.pCommandBuffers = &command_buffer[1];
22747 submit_info.waitSemaphoreCount = 1;
22748 submit_info.pWaitSemaphores = &semaphore;
22749 submit_info.pWaitDstStageMask = flags;
22750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22751 }
22752
22753 vkQueueWaitIdle(m_device->m_queue);
22754
22755 vkDestroyFence(m_device->device(), fence, nullptr);
22756 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22757 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22758 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22759
22760 m_errorMonitor->VerifyNotFound();
22761}
22762
22763// This is a positive test. No errors should be generated.
22764TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022765 TEST_DESCRIPTION(
22766 "Two command buffers, each in a separate QueueSubmit call "
22767 "submitted on separate queues, the second having a fence"
22768 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022769
Tony Barbour1fa09702017-03-16 12:09:08 -060022770 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022771 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022772
22773 m_errorMonitor->ExpectSuccess();
22774
22775 VkFence fence;
22776 VkFenceCreateInfo fence_create_info{};
22777 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22778 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22779
22780 VkSemaphore semaphore;
22781 VkSemaphoreCreateInfo semaphore_create_info{};
22782 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22783 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22784
22785 VkCommandPool command_pool;
22786 VkCommandPoolCreateInfo pool_create_info{};
22787 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22788 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22789 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22790 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22791
22792 VkCommandBuffer command_buffer[2];
22793 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22794 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22795 command_buffer_allocate_info.commandPool = command_pool;
22796 command_buffer_allocate_info.commandBufferCount = 2;
22797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22799
22800 VkQueue queue = VK_NULL_HANDLE;
22801 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22802
22803 {
22804 VkCommandBufferBeginInfo begin_info{};
22805 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22806 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22807
22808 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 -070022809 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022810
22811 VkViewport viewport{};
22812 viewport.maxDepth = 1.0f;
22813 viewport.minDepth = 0.0f;
22814 viewport.width = 512;
22815 viewport.height = 512;
22816 viewport.x = 0;
22817 viewport.y = 0;
22818 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22819 vkEndCommandBuffer(command_buffer[0]);
22820 }
22821 {
22822 VkCommandBufferBeginInfo begin_info{};
22823 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22824 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22825
22826 VkViewport viewport{};
22827 viewport.maxDepth = 1.0f;
22828 viewport.minDepth = 0.0f;
22829 viewport.width = 512;
22830 viewport.height = 512;
22831 viewport.x = 0;
22832 viewport.y = 0;
22833 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22834 vkEndCommandBuffer(command_buffer[1]);
22835 }
22836 {
22837 VkSubmitInfo submit_info{};
22838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22839 submit_info.commandBufferCount = 1;
22840 submit_info.pCommandBuffers = &command_buffer[0];
22841 submit_info.signalSemaphoreCount = 1;
22842 submit_info.pSignalSemaphores = &semaphore;
22843 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22844 }
22845 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022846 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022847 VkSubmitInfo submit_info{};
22848 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22849 submit_info.commandBufferCount = 1;
22850 submit_info.pCommandBuffers = &command_buffer[1];
22851 submit_info.waitSemaphoreCount = 1;
22852 submit_info.pWaitSemaphores = &semaphore;
22853 submit_info.pWaitDstStageMask = flags;
22854 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22855 }
22856
22857 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22858 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22859
22860 vkDestroyFence(m_device->device(), fence, nullptr);
22861 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22862 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22863 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22864
22865 m_errorMonitor->VerifyNotFound();
22866}
22867
22868TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022869 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022870 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022871 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022872 return;
22873 }
22874
22875 VkResult err;
22876
22877 m_errorMonitor->ExpectSuccess();
22878
22879 VkQueue q0 = m_device->m_queue;
22880 VkQueue q1 = nullptr;
22881 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22882 ASSERT_NE(q1, nullptr);
22883
22884 // An (empty) command buffer. We must have work in the first submission --
22885 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022886 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022887 VkCommandPool pool;
22888 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22889 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022890 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22891 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022892 VkCommandBuffer cb;
22893 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22894 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022895 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022896 err = vkBeginCommandBuffer(cb, &cbbi);
22897 ASSERT_VK_SUCCESS(err);
22898 err = vkEndCommandBuffer(cb);
22899 ASSERT_VK_SUCCESS(err);
22900
22901 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022902 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022903 VkSemaphore s;
22904 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22905 ASSERT_VK_SUCCESS(err);
22906
22907 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022908 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022909
22910 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22911 ASSERT_VK_SUCCESS(err);
22912
22913 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022914 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022915 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022916
22917 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22918 ASSERT_VK_SUCCESS(err);
22919
22920 // Wait for q0 idle
22921 err = vkQueueWaitIdle(q0);
22922 ASSERT_VK_SUCCESS(err);
22923
22924 // Command buffer should have been completed (it was on q0); reset the pool.
22925 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22926
22927 m_errorMonitor->VerifyNotFound();
22928
22929 // Force device completely idle and clean up resources
22930 vkDeviceWaitIdle(m_device->device());
22931 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22932 vkDestroySemaphore(m_device->device(), s, nullptr);
22933}
22934
22935// This is a positive test. No errors should be generated.
22936TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022937 TEST_DESCRIPTION(
22938 "Two command buffers, each in a separate QueueSubmit call "
22939 "submitted on separate queues, the second having a fence, "
22940 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022941
Tony Barbour1fa09702017-03-16 12:09:08 -060022942 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022943 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022944
22945 m_errorMonitor->ExpectSuccess();
22946
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022947 VkFence fence;
22948 VkFenceCreateInfo fence_create_info{};
22949 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22950 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22951
22952 VkSemaphore semaphore;
22953 VkSemaphoreCreateInfo semaphore_create_info{};
22954 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22955 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22956
22957 VkCommandPool command_pool;
22958 VkCommandPoolCreateInfo pool_create_info{};
22959 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22960 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22961 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22962 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22963
22964 VkCommandBuffer command_buffer[2];
22965 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22966 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22967 command_buffer_allocate_info.commandPool = command_pool;
22968 command_buffer_allocate_info.commandBufferCount = 2;
22969 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22970 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22971
22972 VkQueue queue = VK_NULL_HANDLE;
22973 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22974
22975 {
22976 VkCommandBufferBeginInfo begin_info{};
22977 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22978 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22979
22980 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 -070022981 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022982
22983 VkViewport viewport{};
22984 viewport.maxDepth = 1.0f;
22985 viewport.minDepth = 0.0f;
22986 viewport.width = 512;
22987 viewport.height = 512;
22988 viewport.x = 0;
22989 viewport.y = 0;
22990 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22991 vkEndCommandBuffer(command_buffer[0]);
22992 }
22993 {
22994 VkCommandBufferBeginInfo begin_info{};
22995 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22996 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22997
22998 VkViewport viewport{};
22999 viewport.maxDepth = 1.0f;
23000 viewport.minDepth = 0.0f;
23001 viewport.width = 512;
23002 viewport.height = 512;
23003 viewport.x = 0;
23004 viewport.y = 0;
23005 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23006 vkEndCommandBuffer(command_buffer[1]);
23007 }
23008 {
23009 VkSubmitInfo submit_info{};
23010 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23011 submit_info.commandBufferCount = 1;
23012 submit_info.pCommandBuffers = &command_buffer[0];
23013 submit_info.signalSemaphoreCount = 1;
23014 submit_info.pSignalSemaphores = &semaphore;
23015 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
23016 }
23017 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023018 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023019 VkSubmitInfo submit_info{};
23020 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23021 submit_info.commandBufferCount = 1;
23022 submit_info.pCommandBuffers = &command_buffer[1];
23023 submit_info.waitSemaphoreCount = 1;
23024 submit_info.pWaitSemaphores = &semaphore;
23025 submit_info.pWaitDstStageMask = flags;
23026 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
23027 }
23028
23029 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23030
23031 vkDestroyFence(m_device->device(), fence, nullptr);
23032 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23033 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23034 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23035
23036 m_errorMonitor->VerifyNotFound();
23037}
23038
23039// This is a positive test. No errors should be generated.
23040TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023041 TEST_DESCRIPTION(
23042 "Two command buffers, each in a separate QueueSubmit call "
23043 "on the same queue, sharing a signal/wait semaphore, the "
23044 "second having a fence, "
23045 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023046
23047 m_errorMonitor->ExpectSuccess();
23048
Tony Barbour1fa09702017-03-16 12:09:08 -060023049 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023050 VkFence fence;
23051 VkFenceCreateInfo fence_create_info{};
23052 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
23053 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
23054
23055 VkSemaphore semaphore;
23056 VkSemaphoreCreateInfo semaphore_create_info{};
23057 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
23058 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
23059
23060 VkCommandPool command_pool;
23061 VkCommandPoolCreateInfo pool_create_info{};
23062 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
23063 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
23064 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
23065 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
23066
23067 VkCommandBuffer command_buffer[2];
23068 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
23069 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23070 command_buffer_allocate_info.commandPool = command_pool;
23071 command_buffer_allocate_info.commandBufferCount = 2;
23072 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23073 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
23074
23075 {
23076 VkCommandBufferBeginInfo begin_info{};
23077 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23078 vkBeginCommandBuffer(command_buffer[0], &begin_info);
23079
23080 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 -070023081 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023082
23083 VkViewport viewport{};
23084 viewport.maxDepth = 1.0f;
23085 viewport.minDepth = 0.0f;
23086 viewport.width = 512;
23087 viewport.height = 512;
23088 viewport.x = 0;
23089 viewport.y = 0;
23090 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
23091 vkEndCommandBuffer(command_buffer[0]);
23092 }
23093 {
23094 VkCommandBufferBeginInfo begin_info{};
23095 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23096 vkBeginCommandBuffer(command_buffer[1], &begin_info);
23097
23098 VkViewport viewport{};
23099 viewport.maxDepth = 1.0f;
23100 viewport.minDepth = 0.0f;
23101 viewport.width = 512;
23102 viewport.height = 512;
23103 viewport.x = 0;
23104 viewport.y = 0;
23105 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23106 vkEndCommandBuffer(command_buffer[1]);
23107 }
23108 {
23109 VkSubmitInfo submit_info{};
23110 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23111 submit_info.commandBufferCount = 1;
23112 submit_info.pCommandBuffers = &command_buffer[0];
23113 submit_info.signalSemaphoreCount = 1;
23114 submit_info.pSignalSemaphores = &semaphore;
23115 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
23116 }
23117 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023118 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023119 VkSubmitInfo submit_info{};
23120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23121 submit_info.commandBufferCount = 1;
23122 submit_info.pCommandBuffers = &command_buffer[1];
23123 submit_info.waitSemaphoreCount = 1;
23124 submit_info.pWaitSemaphores = &semaphore;
23125 submit_info.pWaitDstStageMask = flags;
23126 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
23127 }
23128
23129 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23130
23131 vkDestroyFence(m_device->device(), fence, nullptr);
23132 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23133 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23134 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23135
23136 m_errorMonitor->VerifyNotFound();
23137}
23138
23139// This is a positive test. No errors should be generated.
23140TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023141 TEST_DESCRIPTION(
23142 "Two command buffers, each in a separate QueueSubmit call "
23143 "on the same queue, no fences, followed by a third QueueSubmit with NO "
23144 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023145
23146 m_errorMonitor->ExpectSuccess();
23147
Tony Barbour1fa09702017-03-16 12:09:08 -060023148 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023149 VkFence fence;
23150 VkFenceCreateInfo fence_create_info{};
23151 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
23152 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
23153
23154 VkCommandPool command_pool;
23155 VkCommandPoolCreateInfo pool_create_info{};
23156 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
23157 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
23158 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
23159 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
23160
23161 VkCommandBuffer command_buffer[2];
23162 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
23163 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23164 command_buffer_allocate_info.commandPool = command_pool;
23165 command_buffer_allocate_info.commandBufferCount = 2;
23166 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23167 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
23168
23169 {
23170 VkCommandBufferBeginInfo begin_info{};
23171 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23172 vkBeginCommandBuffer(command_buffer[0], &begin_info);
23173
23174 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 -070023175 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023176
23177 VkViewport viewport{};
23178 viewport.maxDepth = 1.0f;
23179 viewport.minDepth = 0.0f;
23180 viewport.width = 512;
23181 viewport.height = 512;
23182 viewport.x = 0;
23183 viewport.y = 0;
23184 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
23185 vkEndCommandBuffer(command_buffer[0]);
23186 }
23187 {
23188 VkCommandBufferBeginInfo begin_info{};
23189 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23190 vkBeginCommandBuffer(command_buffer[1], &begin_info);
23191
23192 VkViewport viewport{};
23193 viewport.maxDepth = 1.0f;
23194 viewport.minDepth = 0.0f;
23195 viewport.width = 512;
23196 viewport.height = 512;
23197 viewport.x = 0;
23198 viewport.y = 0;
23199 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23200 vkEndCommandBuffer(command_buffer[1]);
23201 }
23202 {
23203 VkSubmitInfo submit_info{};
23204 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23205 submit_info.commandBufferCount = 1;
23206 submit_info.pCommandBuffers = &command_buffer[0];
23207 submit_info.signalSemaphoreCount = 0;
23208 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
23209 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
23210 }
23211 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023212 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023213 VkSubmitInfo submit_info{};
23214 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23215 submit_info.commandBufferCount = 1;
23216 submit_info.pCommandBuffers = &command_buffer[1];
23217 submit_info.waitSemaphoreCount = 0;
23218 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
23219 submit_info.pWaitDstStageMask = flags;
23220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
23221 }
23222
23223 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
23224
23225 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23226 ASSERT_VK_SUCCESS(err);
23227
23228 vkDestroyFence(m_device->device(), fence, nullptr);
23229 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23230 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23231
23232 m_errorMonitor->VerifyNotFound();
23233}
23234
23235// This is a positive test. No errors should be generated.
23236TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023237 TEST_DESCRIPTION(
23238 "Two command buffers, each in a separate QueueSubmit call "
23239 "on the same queue, the second having a fence, followed "
23240 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023241
23242 m_errorMonitor->ExpectSuccess();
23243
Tony Barbour1fa09702017-03-16 12:09:08 -060023244 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023245 VkFence fence;
23246 VkFenceCreateInfo fence_create_info{};
23247 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
23248 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
23249
23250 VkCommandPool command_pool;
23251 VkCommandPoolCreateInfo pool_create_info{};
23252 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
23253 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
23254 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
23255 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
23256
23257 VkCommandBuffer command_buffer[2];
23258 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
23259 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23260 command_buffer_allocate_info.commandPool = command_pool;
23261 command_buffer_allocate_info.commandBufferCount = 2;
23262 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23263 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
23264
23265 {
23266 VkCommandBufferBeginInfo begin_info{};
23267 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23268 vkBeginCommandBuffer(command_buffer[0], &begin_info);
23269
23270 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 -070023271 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023272
23273 VkViewport viewport{};
23274 viewport.maxDepth = 1.0f;
23275 viewport.minDepth = 0.0f;
23276 viewport.width = 512;
23277 viewport.height = 512;
23278 viewport.x = 0;
23279 viewport.y = 0;
23280 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
23281 vkEndCommandBuffer(command_buffer[0]);
23282 }
23283 {
23284 VkCommandBufferBeginInfo begin_info{};
23285 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23286 vkBeginCommandBuffer(command_buffer[1], &begin_info);
23287
23288 VkViewport viewport{};
23289 viewport.maxDepth = 1.0f;
23290 viewport.minDepth = 0.0f;
23291 viewport.width = 512;
23292 viewport.height = 512;
23293 viewport.x = 0;
23294 viewport.y = 0;
23295 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23296 vkEndCommandBuffer(command_buffer[1]);
23297 }
23298 {
23299 VkSubmitInfo submit_info{};
23300 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23301 submit_info.commandBufferCount = 1;
23302 submit_info.pCommandBuffers = &command_buffer[0];
23303 submit_info.signalSemaphoreCount = 0;
23304 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
23305 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
23306 }
23307 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023308 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023309 VkSubmitInfo submit_info{};
23310 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23311 submit_info.commandBufferCount = 1;
23312 submit_info.pCommandBuffers = &command_buffer[1];
23313 submit_info.waitSemaphoreCount = 0;
23314 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
23315 submit_info.pWaitDstStageMask = flags;
23316 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
23317 }
23318
23319 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23320
23321 vkDestroyFence(m_device->device(), fence, nullptr);
23322 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23323 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23324
23325 m_errorMonitor->VerifyNotFound();
23326}
23327
23328// This is a positive test. No errors should be generated.
23329TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023330 TEST_DESCRIPTION(
23331 "Two command buffers each in a separate SubmitInfo sent in a single "
23332 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060023333 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023334
23335 m_errorMonitor->ExpectSuccess();
23336
23337 VkFence fence;
23338 VkFenceCreateInfo fence_create_info{};
23339 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
23340 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
23341
23342 VkSemaphore semaphore;
23343 VkSemaphoreCreateInfo semaphore_create_info{};
23344 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
23345 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
23346
23347 VkCommandPool command_pool;
23348 VkCommandPoolCreateInfo pool_create_info{};
23349 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
23350 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
23351 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
23352 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
23353
23354 VkCommandBuffer command_buffer[2];
23355 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
23356 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23357 command_buffer_allocate_info.commandPool = command_pool;
23358 command_buffer_allocate_info.commandBufferCount = 2;
23359 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23360 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
23361
23362 {
23363 VkCommandBufferBeginInfo begin_info{};
23364 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23365 vkBeginCommandBuffer(command_buffer[0], &begin_info);
23366
23367 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 -070023368 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023369
23370 VkViewport viewport{};
23371 viewport.maxDepth = 1.0f;
23372 viewport.minDepth = 0.0f;
23373 viewport.width = 512;
23374 viewport.height = 512;
23375 viewport.x = 0;
23376 viewport.y = 0;
23377 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
23378 vkEndCommandBuffer(command_buffer[0]);
23379 }
23380 {
23381 VkCommandBufferBeginInfo begin_info{};
23382 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23383 vkBeginCommandBuffer(command_buffer[1], &begin_info);
23384
23385 VkViewport viewport{};
23386 viewport.maxDepth = 1.0f;
23387 viewport.minDepth = 0.0f;
23388 viewport.width = 512;
23389 viewport.height = 512;
23390 viewport.x = 0;
23391 viewport.y = 0;
23392 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23393 vkEndCommandBuffer(command_buffer[1]);
23394 }
23395 {
23396 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023397 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023398
23399 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23400 submit_info[0].pNext = NULL;
23401 submit_info[0].commandBufferCount = 1;
23402 submit_info[0].pCommandBuffers = &command_buffer[0];
23403 submit_info[0].signalSemaphoreCount = 1;
23404 submit_info[0].pSignalSemaphores = &semaphore;
23405 submit_info[0].waitSemaphoreCount = 0;
23406 submit_info[0].pWaitSemaphores = NULL;
23407 submit_info[0].pWaitDstStageMask = 0;
23408
23409 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23410 submit_info[1].pNext = NULL;
23411 submit_info[1].commandBufferCount = 1;
23412 submit_info[1].pCommandBuffers = &command_buffer[1];
23413 submit_info[1].waitSemaphoreCount = 1;
23414 submit_info[1].pWaitSemaphores = &semaphore;
23415 submit_info[1].pWaitDstStageMask = flags;
23416 submit_info[1].signalSemaphoreCount = 0;
23417 submit_info[1].pSignalSemaphores = NULL;
23418 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
23419 }
23420
23421 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23422
23423 vkDestroyFence(m_device->device(), fence, nullptr);
23424 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23425 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23426 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23427
23428 m_errorMonitor->VerifyNotFound();
23429}
23430
23431TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
23432 m_errorMonitor->ExpectSuccess();
23433
Tony Barbour1fa09702017-03-16 12:09:08 -060023434 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23436
Tony Barbour552f6c02016-12-21 14:34:07 -070023437 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023438
23439 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
23440 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23441 m_errorMonitor->VerifyNotFound();
23442 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
23443 m_errorMonitor->VerifyNotFound();
23444 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23445 m_errorMonitor->VerifyNotFound();
23446
23447 m_commandBuffer->EndCommandBuffer();
23448 m_errorMonitor->VerifyNotFound();
23449}
23450
23451TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023452 TEST_DESCRIPTION(
23453 "Positive test where we create a renderpass with an "
23454 "attachment that uses LOAD_OP_CLEAR, the first subpass "
23455 "has a valid layout, and a second subpass then uses a "
23456 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023457 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060023458 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023459 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023460 if (!depth_format) {
23461 printf(" No Depth + Stencil format found. Skipped.\n");
23462 return;
23463 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023464
23465 VkAttachmentReference attach[2] = {};
23466 attach[0].attachment = 0;
23467 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23468 attach[1].attachment = 0;
23469 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23470 VkSubpassDescription subpasses[2] = {};
23471 // First subpass clears DS attach on load
23472 subpasses[0].pDepthStencilAttachment = &attach[0];
23473 // 2nd subpass reads in DS as input attachment
23474 subpasses[1].inputAttachmentCount = 1;
23475 subpasses[1].pInputAttachments = &attach[1];
23476 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070023477 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023478 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
23479 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
23480 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
23481 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23482 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23483 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23484 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23485 VkRenderPassCreateInfo rpci = {};
23486 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
23487 rpci.attachmentCount = 1;
23488 rpci.pAttachments = &attach_desc;
23489 rpci.subpassCount = 2;
23490 rpci.pSubpasses = subpasses;
23491
23492 // Now create RenderPass and verify no errors
23493 VkRenderPass rp;
23494 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
23495 m_errorMonitor->VerifyNotFound();
23496
23497 vkDestroyRenderPass(m_device->device(), rp, NULL);
23498}
23499
Tobin Ehlis01103de2017-02-16 13:22:47 -070023500TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
23501 TEST_DESCRIPTION(
23502 "Create a render pass with depth-stencil attachment where layout transition "
23503 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
23504 "transition has correctly occurred at queue submit time with no validation errors.");
23505
Tony Barbour1fa09702017-03-16 12:09:08 -060023506 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023507 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023508 if (!depth_format) {
23509 printf(" No Depth + Stencil format found. Skipped.\n");
23510 return;
23511 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070023512 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070023513 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023514 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
23515 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070023516 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070023517 return;
23518 }
23519
23520 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070023521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23522
23523 // A renderpass with one depth/stencil attachment.
23524 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070023525 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023526 VK_SAMPLE_COUNT_1_BIT,
23527 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23528 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23529 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23530 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23531 VK_IMAGE_LAYOUT_UNDEFINED,
23532 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23533
23534 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23535
23536 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23537
23538 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23539
23540 VkRenderPass rp;
23541 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23542 ASSERT_VK_SUCCESS(err);
23543 // A compatible ds image.
23544 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023545 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 -070023546 ASSERT_TRUE(image.initialized());
23547
23548 VkImageViewCreateInfo ivci = {
23549 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23550 nullptr,
23551 0,
23552 image.handle(),
23553 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023554 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023555 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23556 VK_COMPONENT_SWIZZLE_IDENTITY},
23557 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23558 };
23559 VkImageView view;
23560 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23561 ASSERT_VK_SUCCESS(err);
23562
23563 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23564 VkFramebuffer fb;
23565 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23566 ASSERT_VK_SUCCESS(err);
23567
23568 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23569 m_commandBuffer->BeginCommandBuffer();
23570 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23571 vkCmdEndRenderPass(m_commandBuffer->handle());
23572 m_commandBuffer->EndCommandBuffer();
23573 QueueCommandBuffer(false);
23574 m_errorMonitor->VerifyNotFound();
23575
23576 // Cleanup
23577 vkDestroyImageView(m_device->device(), view, NULL);
23578 vkDestroyRenderPass(m_device->device(), rp, NULL);
23579 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23580}
23581
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023582TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023583 TEST_DESCRIPTION(
23584 "Test that pipeline validation accepts matrices passed "
23585 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023586 m_errorMonitor->ExpectSuccess();
23587
Tony Barbour1fa09702017-03-16 12:09:08 -060023588 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023589 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23590
23591 VkVertexInputBindingDescription input_binding;
23592 memset(&input_binding, 0, sizeof(input_binding));
23593
23594 VkVertexInputAttributeDescription input_attribs[2];
23595 memset(input_attribs, 0, sizeof(input_attribs));
23596
23597 for (int i = 0; i < 2; i++) {
23598 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23599 input_attribs[i].location = i;
23600 }
23601
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023602 char const *vsSource =
23603 "#version 450\n"
23604 "\n"
23605 "layout(location=0) in mat2x4 x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023606 "void main(){\n"
23607 " gl_Position = x[0] + x[1];\n"
23608 "}\n";
23609 char const *fsSource =
23610 "#version 450\n"
23611 "\n"
23612 "layout(location=0) out vec4 color;\n"
23613 "void main(){\n"
23614 " color = vec4(1);\n"
23615 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023616
23617 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23618 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23619
23620 VkPipelineObj pipe(m_device);
23621 pipe.AddColorAttachment();
23622 pipe.AddShader(&vs);
23623 pipe.AddShader(&fs);
23624
23625 pipe.AddVertexInputBindings(&input_binding, 1);
23626 pipe.AddVertexInputAttribs(input_attribs, 2);
23627
23628 VkDescriptorSetObj descriptorSet(m_device);
23629 descriptorSet.AppendDummy();
23630 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23631
23632 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23633
23634 /* expect success */
23635 m_errorMonitor->VerifyNotFound();
23636}
23637
23638TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23639 m_errorMonitor->ExpectSuccess();
23640
Tony Barbour1fa09702017-03-16 12:09:08 -060023641 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023642 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23643
23644 VkVertexInputBindingDescription input_binding;
23645 memset(&input_binding, 0, sizeof(input_binding));
23646
23647 VkVertexInputAttributeDescription input_attribs[2];
23648 memset(input_attribs, 0, sizeof(input_attribs));
23649
23650 for (int i = 0; i < 2; i++) {
23651 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23652 input_attribs[i].location = i;
23653 }
23654
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023655 char const *vsSource =
23656 "#version 450\n"
23657 "\n"
23658 "layout(location=0) in vec4 x[2];\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023659 "void main(){\n"
23660 " gl_Position = x[0] + x[1];\n"
23661 "}\n";
23662 char const *fsSource =
23663 "#version 450\n"
23664 "\n"
23665 "layout(location=0) out vec4 color;\n"
23666 "void main(){\n"
23667 " color = vec4(1);\n"
23668 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023669
23670 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23671 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23672
23673 VkPipelineObj pipe(m_device);
23674 pipe.AddColorAttachment();
23675 pipe.AddShader(&vs);
23676 pipe.AddShader(&fs);
23677
23678 pipe.AddVertexInputBindings(&input_binding, 1);
23679 pipe.AddVertexInputAttribs(input_attribs, 2);
23680
23681 VkDescriptorSetObj descriptorSet(m_device);
23682 descriptorSet.AppendDummy();
23683 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23684
23685 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23686
23687 m_errorMonitor->VerifyNotFound();
23688}
23689
23690TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023691 TEST_DESCRIPTION(
23692 "Test that pipeline validation accepts consuming a vertex attribute "
23693 "through multiple vertex shader inputs, each consuming a different "
23694 "subset of the components.");
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 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23699
23700 VkVertexInputBindingDescription input_binding;
23701 memset(&input_binding, 0, sizeof(input_binding));
23702
23703 VkVertexInputAttributeDescription input_attribs[3];
23704 memset(input_attribs, 0, sizeof(input_attribs));
23705
23706 for (int i = 0; i < 3; i++) {
23707 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23708 input_attribs[i].location = i;
23709 }
23710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023711 char const *vsSource =
23712 "#version 450\n"
23713 "\n"
23714 "layout(location=0) in vec4 x;\n"
23715 "layout(location=1) in vec3 y1;\n"
23716 "layout(location=1, component=3) in float y2;\n"
23717 "layout(location=2) in vec4 z;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023718 "void main(){\n"
23719 " gl_Position = x + vec4(y1, y2) + z;\n"
23720 "}\n";
23721 char const *fsSource =
23722 "#version 450\n"
23723 "\n"
23724 "layout(location=0) out vec4 color;\n"
23725 "void main(){\n"
23726 " color = vec4(1);\n"
23727 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023728
23729 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23730 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23731
23732 VkPipelineObj pipe(m_device);
23733 pipe.AddColorAttachment();
23734 pipe.AddShader(&vs);
23735 pipe.AddShader(&fs);
23736
23737 pipe.AddVertexInputBindings(&input_binding, 1);
23738 pipe.AddVertexInputAttribs(input_attribs, 3);
23739
23740 VkDescriptorSetObj descriptorSet(m_device);
23741 descriptorSet.AppendDummy();
23742 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23743
23744 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23745
23746 m_errorMonitor->VerifyNotFound();
23747}
23748
23749TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23750 m_errorMonitor->ExpectSuccess();
23751
Tony Barbour1fa09702017-03-16 12:09:08 -060023752 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23754
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023755 char const *vsSource =
23756 "#version 450\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023757 "void main(){\n"
23758 " gl_Position = vec4(0);\n"
23759 "}\n";
23760 char const *fsSource =
23761 "#version 450\n"
23762 "\n"
23763 "layout(location=0) out vec4 color;\n"
23764 "void main(){\n"
23765 " color = vec4(1);\n"
23766 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023767
23768 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23769 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23770
23771 VkPipelineObj pipe(m_device);
23772 pipe.AddColorAttachment();
23773 pipe.AddShader(&vs);
23774 pipe.AddShader(&fs);
23775
23776 VkDescriptorSetObj descriptorSet(m_device);
23777 descriptorSet.AppendDummy();
23778 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23779
23780 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23781
23782 m_errorMonitor->VerifyNotFound();
23783}
23784
23785TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023786 TEST_DESCRIPTION(
23787 "Test that pipeline validation accepts the relaxed type matching rules "
23788 "set out in 14.1.3: fundamental type must match, and producer side must "
23789 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023790 m_errorMonitor->ExpectSuccess();
23791
23792 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23793
Tony Barbour1fa09702017-03-16 12:09:08 -060023794 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23796
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023797 char const *vsSource =
23798 "#version 450\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023799 "layout(location=0) out vec3 x;\n"
23800 "layout(location=1) out ivec3 y;\n"
23801 "layout(location=2) out vec3 z;\n"
23802 "void main(){\n"
23803 " gl_Position = vec4(0);\n"
23804 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23805 "}\n";
23806 char const *fsSource =
23807 "#version 450\n"
23808 "\n"
23809 "layout(location=0) out vec4 color;\n"
23810 "layout(location=0) in float x;\n"
23811 "layout(location=1) flat in int y;\n"
23812 "layout(location=2) in vec2 z;\n"
23813 "void main(){\n"
23814 " color = vec4(1 + x + y + z.x);\n"
23815 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023816
23817 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23818 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23819
23820 VkPipelineObj pipe(m_device);
23821 pipe.AddColorAttachment();
23822 pipe.AddShader(&vs);
23823 pipe.AddShader(&fs);
23824
23825 VkDescriptorSetObj descriptorSet(m_device);
23826 descriptorSet.AppendDummy();
23827 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23828
23829 VkResult err = VK_SUCCESS;
23830 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23831 ASSERT_VK_SUCCESS(err);
23832
23833 m_errorMonitor->VerifyNotFound();
23834}
23835
23836TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023837 TEST_DESCRIPTION(
23838 "Test that pipeline validation accepts per-vertex variables "
23839 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023840 m_errorMonitor->ExpectSuccess();
23841
Tony Barbour1fa09702017-03-16 12:09:08 -060023842 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023843 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23844
23845 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023846 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023847 return;
23848 }
23849
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023850 char const *vsSource =
23851 "#version 450\n"
23852 "void main(){}\n";
23853 char const *tcsSource =
23854 "#version 450\n"
23855 "layout(location=0) out int x[];\n"
23856 "layout(vertices=3) out;\n"
23857 "void main(){\n"
23858 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23859 " gl_TessLevelInner[0] = 1;\n"
23860 " x[gl_InvocationID] = gl_InvocationID;\n"
23861 "}\n";
23862 char const *tesSource =
23863 "#version 450\n"
23864 "layout(triangles, equal_spacing, cw) in;\n"
23865 "layout(location=0) in int x[];\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023866 "void main(){\n"
23867 " gl_Position.xyz = gl_TessCoord;\n"
23868 " gl_Position.w = x[0] + x[1] + x[2];\n"
23869 "}\n";
23870 char const *fsSource =
23871 "#version 450\n"
23872 "layout(location=0) out vec4 color;\n"
23873 "void main(){\n"
23874 " color = vec4(1);\n"
23875 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023876
23877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23878 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23879 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23880 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23881
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023882 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23883 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023884
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023885 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023886
23887 VkPipelineObj pipe(m_device);
23888 pipe.SetInputAssembly(&iasci);
23889 pipe.SetTessellation(&tsci);
23890 pipe.AddColorAttachment();
23891 pipe.AddShader(&vs);
23892 pipe.AddShader(&tcs);
23893 pipe.AddShader(&tes);
23894 pipe.AddShader(&fs);
23895
23896 VkDescriptorSetObj descriptorSet(m_device);
23897 descriptorSet.AppendDummy();
23898 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23899
23900 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23901
23902 m_errorMonitor->VerifyNotFound();
23903}
23904
23905TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023906 TEST_DESCRIPTION(
23907 "Test that pipeline validation accepts a user-defined "
23908 "interface block passed into the geometry shader. This "
23909 "is interesting because the 'extra' array level is not "
23910 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023911 m_errorMonitor->ExpectSuccess();
23912
Tony Barbour1fa09702017-03-16 12:09:08 -060023913 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23915
23916 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023917 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023918 return;
23919 }
23920
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023921 char const *vsSource =
23922 "#version 450\n"
23923 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23924 "void main(){\n"
23925 " vs_out.x = vec4(1);\n"
23926 "}\n";
23927 char const *gsSource =
23928 "#version 450\n"
23929 "layout(triangles) in;\n"
23930 "layout(triangle_strip, max_vertices=3) out;\n"
23931 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023932 "void main() {\n"
23933 " gl_Position = gs_in[0].x;\n"
23934 " EmitVertex();\n"
23935 "}\n";
23936 char const *fsSource =
23937 "#version 450\n"
23938 "layout(location=0) out vec4 color;\n"
23939 "void main(){\n"
23940 " color = vec4(1);\n"
23941 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023942
23943 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23944 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23945 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23946
23947 VkPipelineObj pipe(m_device);
23948 pipe.AddColorAttachment();
23949 pipe.AddShader(&vs);
23950 pipe.AddShader(&gs);
23951 pipe.AddShader(&fs);
23952
23953 VkDescriptorSetObj descriptorSet(m_device);
23954 descriptorSet.AppendDummy();
23955 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23956
23957 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23958
23959 m_errorMonitor->VerifyNotFound();
23960}
23961
23962TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023963 TEST_DESCRIPTION(
23964 "Test that pipeline validation accepts basic use of 64bit vertex "
23965 "attributes. This is interesting because they consume multiple "
23966 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023967 m_errorMonitor->ExpectSuccess();
23968
Tony Barbour1fa09702017-03-16 12:09:08 -060023969 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23971
23972 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023973 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023974 return;
23975 }
23976
23977 VkVertexInputBindingDescription input_bindings[1];
23978 memset(input_bindings, 0, sizeof(input_bindings));
23979
23980 VkVertexInputAttributeDescription input_attribs[4];
23981 memset(input_attribs, 0, sizeof(input_attribs));
23982 input_attribs[0].location = 0;
23983 input_attribs[0].offset = 0;
23984 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23985 input_attribs[1].location = 2;
23986 input_attribs[1].offset = 32;
23987 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23988 input_attribs[2].location = 4;
23989 input_attribs[2].offset = 64;
23990 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23991 input_attribs[3].location = 6;
23992 input_attribs[3].offset = 96;
23993 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23994
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023995 char const *vsSource =
23996 "#version 450\n"
23997 "\n"
23998 "layout(location=0) in dmat4 x;\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023999 "void main(){\n"
24000 " gl_Position = vec4(x[0][0]);\n"
24001 "}\n";
24002 char const *fsSource =
24003 "#version 450\n"
24004 "\n"
24005 "layout(location=0) out vec4 color;\n"
24006 "void main(){\n"
24007 " color = vec4(1);\n"
24008 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024009
24010 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
24011 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24012
24013 VkPipelineObj pipe(m_device);
24014 pipe.AddColorAttachment();
24015 pipe.AddShader(&vs);
24016 pipe.AddShader(&fs);
24017
24018 pipe.AddVertexInputBindings(input_bindings, 1);
24019 pipe.AddVertexInputAttribs(input_attribs, 4);
24020
24021 VkDescriptorSetObj descriptorSet(m_device);
24022 descriptorSet.AppendDummy();
24023 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
24024
24025 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
24026
24027 m_errorMonitor->VerifyNotFound();
24028}
24029
24030TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
24031 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
24032 m_errorMonitor->ExpectSuccess();
24033
Tony Barbour1fa09702017-03-16 12:09:08 -060024034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024035
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024036 char const *vsSource =
24037 "#version 450\n"
24038 "\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024039 "void main(){\n"
24040 " gl_Position = vec4(1);\n"
24041 "}\n";
24042 char const *fsSource =
24043 "#version 450\n"
24044 "\n"
24045 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
24046 "layout(location=0) out vec4 color;\n"
24047 "void main() {\n"
24048 " color = subpassLoad(x);\n"
24049 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024050
24051 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
24052 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24053
24054 VkPipelineObj pipe(m_device);
24055 pipe.AddShader(&vs);
24056 pipe.AddShader(&fs);
24057 pipe.AddColorAttachment();
24058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24059
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024060 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
24061 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024062 VkDescriptorSetLayout dsl;
24063 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
24064 ASSERT_VK_SUCCESS(err);
24065
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024066 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024067 VkPipelineLayout pl;
24068 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
24069 ASSERT_VK_SUCCESS(err);
24070
24071 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024072 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
24073 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
24074 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
24075 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
24076 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 -060024077 };
24078 VkAttachmentReference color = {
24079 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
24080 };
24081 VkAttachmentReference input = {
24082 1, VK_IMAGE_LAYOUT_GENERAL,
24083 };
24084
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024085 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024086
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024087 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024088 VkRenderPass rp;
24089 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
24090 ASSERT_VK_SUCCESS(err);
24091
24092 // should be OK. would go wrong here if it's going to...
24093 pipe.CreateVKPipeline(pl, rp);
24094
24095 m_errorMonitor->VerifyNotFound();
24096
24097 vkDestroyRenderPass(m_device->device(), rp, nullptr);
24098 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
24099 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
24100}
24101
24102TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024103 TEST_DESCRIPTION(
24104 "Test that pipeline validation accepts a compute pipeline which declares a "
24105 "descriptor-backed resource which is not provided, but the shader does not "
24106 "statically use it. This is interesting because it requires compute pipelines "
24107 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024108 m_errorMonitor->ExpectSuccess();
24109
Tony Barbour1fa09702017-03-16 12:09:08 -060024110 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024111
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024112 char const *csSource =
24113 "#version 450\n"
24114 "\n"
24115 "layout(local_size_x=1) in;\n"
24116 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
24117 "void main(){\n"
24118 " // x is not used.\n"
24119 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024120
24121 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
24122
24123 VkDescriptorSetObj descriptorSet(m_device);
24124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
24125
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024126 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
24127 nullptr,
24128 0,
24129 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
24130 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
24131 descriptorSet.GetPipelineLayout(),
24132 VK_NULL_HANDLE,
24133 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024134
24135 VkPipeline pipe;
24136 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
24137
24138 m_errorMonitor->VerifyNotFound();
24139
24140 if (err == VK_SUCCESS) {
24141 vkDestroyPipeline(m_device->device(), pipe, nullptr);
24142 }
24143}
24144
24145TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024146 TEST_DESCRIPTION(
24147 "Test that pipeline validation accepts a shader consuming only the "
24148 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024149 m_errorMonitor->ExpectSuccess();
24150
Tony Barbour1fa09702017-03-16 12:09:08 -060024151 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024152
24153 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024154 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
24155 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
24156 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024157 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024158 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024159 VkDescriptorSetLayout dsl;
24160 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
24161 ASSERT_VK_SUCCESS(err);
24162
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024163 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024164 VkPipelineLayout pl;
24165 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
24166 ASSERT_VK_SUCCESS(err);
24167
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024168 char const *csSource =
24169 "#version 450\n"
24170 "\n"
24171 "layout(local_size_x=1) in;\n"
24172 "layout(set=0, binding=0) uniform sampler s;\n"
24173 "layout(set=0, binding=1) uniform texture2D t;\n"
24174 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
24175 "void main() {\n"
24176 " x = texture(sampler2D(t, s), vec2(0));\n"
24177 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024178 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
24179
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024180 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
24181 nullptr,
24182 0,
24183 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
24184 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
24185 pl,
24186 VK_NULL_HANDLE,
24187 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024188
24189 VkPipeline pipe;
24190 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
24191
24192 m_errorMonitor->VerifyNotFound();
24193
24194 if (err == VK_SUCCESS) {
24195 vkDestroyPipeline(m_device->device(), pipe, nullptr);
24196 }
24197
24198 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
24199 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
24200}
24201
24202TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024203 TEST_DESCRIPTION(
24204 "Test that pipeline validation accepts a shader consuming only the "
24205 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024206 m_errorMonitor->ExpectSuccess();
24207
Tony Barbour1fa09702017-03-16 12:09:08 -060024208 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024209
24210 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024211 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
24212 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
24213 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024214 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024215 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024216 VkDescriptorSetLayout dsl;
24217 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
24218 ASSERT_VK_SUCCESS(err);
24219
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024220 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024221 VkPipelineLayout pl;
24222 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
24223 ASSERT_VK_SUCCESS(err);
24224
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024225 char const *csSource =
24226 "#version 450\n"
24227 "\n"
24228 "layout(local_size_x=1) in;\n"
24229 "layout(set=0, binding=0) uniform texture2D t;\n"
24230 "layout(set=0, binding=1) uniform sampler s;\n"
24231 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
24232 "void main() {\n"
24233 " x = texture(sampler2D(t, s), vec2(0));\n"
24234 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024235 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
24236
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024237 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
24238 nullptr,
24239 0,
24240 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
24241 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
24242 pl,
24243 VK_NULL_HANDLE,
24244 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024245
24246 VkPipeline pipe;
24247 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
24248
24249 m_errorMonitor->VerifyNotFound();
24250
24251 if (err == VK_SUCCESS) {
24252 vkDestroyPipeline(m_device->device(), pipe, nullptr);
24253 }
24254
24255 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
24256 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
24257}
24258
24259TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024260 TEST_DESCRIPTION(
24261 "Test that pipeline validation accepts a shader consuming "
24262 "both the sampler and the image of a combined image+sampler "
24263 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024264 m_errorMonitor->ExpectSuccess();
24265
Tony Barbour1fa09702017-03-16 12:09:08 -060024266 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024267
24268 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024269 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
24270 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024271 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024272 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024273 VkDescriptorSetLayout dsl;
24274 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
24275 ASSERT_VK_SUCCESS(err);
24276
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024277 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024278 VkPipelineLayout pl;
24279 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
24280 ASSERT_VK_SUCCESS(err);
24281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024282 char const *csSource =
24283 "#version 450\n"
24284 "\n"
24285 "layout(local_size_x=1) in;\n"
24286 "layout(set=0, binding=0) uniform texture2D t;\n"
24287 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
24288 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
24289 "void main() {\n"
24290 " x = texture(sampler2D(t, s), vec2(0));\n"
24291 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024292 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
24293
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070024294 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
24295 nullptr,
24296 0,
24297 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
24298 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
24299 pl,
24300 VK_NULL_HANDLE,
24301 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024302
24303 VkPipeline pipe;
24304 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
24305
24306 m_errorMonitor->VerifyNotFound();
24307
24308 if (err == VK_SUCCESS) {
24309 vkDestroyPipeline(m_device->device(), pipe, nullptr);
24310 }
24311
24312 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
24313 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
24314}
24315
Tony Barbour3ed87a02017-03-15 16:19:02 -060024316TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024317 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
24318
Tony Barbour3ed87a02017-03-15 16:19:02 -060024319 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060024320 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060024321
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024322 // Ensure that extension is available and enabled.
24323 uint32_t extension_count = 0;
24324 bool supports_maintenance1_extension = false;
24325 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24326 ASSERT_VK_SUCCESS(err);
24327 if (extension_count > 0) {
24328 std::vector<VkExtensionProperties> available_extensions(extension_count);
24329
24330 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24331 ASSERT_VK_SUCCESS(err);
24332 for (const auto &extension_props : available_extensions) {
24333 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
24334 supports_maintenance1_extension = true;
24335 }
24336 }
24337 }
24338
24339 // Proceed if extension is supported by hardware
24340 if (!supports_maintenance1_extension) {
24341 printf(" Maintenance1 Extension not supported, skipping tests\n");
24342 return;
24343 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024344
24345 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060024346 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024347 VkCommandBuffer cmd_buf;
24348 VkCommandBufferAllocateInfo alloc_info;
24349 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
24350 alloc_info.pNext = NULL;
24351 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070024352 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024353 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
24354 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
24355
24356 VkCommandBufferBeginInfo cb_binfo;
24357 cb_binfo.pNext = NULL;
24358 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
24359 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
24360 cb_binfo.flags = 0;
24361 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
24362 // Set Negative height, should give error if Maintenance 1 is not enabled
24363 VkViewport viewport = {0, 0, 16, -16, 0, 1};
24364 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
24365 vkEndCommandBuffer(cmd_buf);
24366
24367 m_errorMonitor->VerifyNotFound();
24368}
24369
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060024370TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
24371 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
24372
24373 ASSERT_NO_FATAL_FAILURE(Init());
24374
24375 uint32_t extension_count = 0;
24376 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24377 ASSERT_VK_SUCCESS(err);
24378
24379 if (extension_count > 0) {
24380 std::vector<VkExtensionProperties> available_extensions(extension_count);
24381 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24382 ASSERT_VK_SUCCESS(err);
24383
24384 for (const auto &extension_props : available_extensions) {
24385 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24386 // Create two pNext structures which by themselves would be valid
24387 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24388 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
24389 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24390 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
24391 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24392
24393 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24394 dedicated_buffer_create_info_2.pNext = nullptr;
24395 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
24396
24397 uint32_t queue_family_index = 0;
24398 VkBufferCreateInfo buffer_create_info = {};
24399 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24400 buffer_create_info.pNext = &dedicated_buffer_create_info;
24401 buffer_create_info.size = 1024;
24402 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24403 buffer_create_info.queueFamilyIndexCount = 1;
24404 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24405
24406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
24407 VkBuffer buffer;
24408 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
24409 m_errorMonitor->VerifyFound();
24410 }
24411 }
24412 }
24413}
24414
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024415TEST_F(VkPositiveLayerTest, ValidStructPNext) {
24416 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
24417
Tony Barbour1fa09702017-03-16 12:09:08 -060024418 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024419
24420 // Positive test to check parameter_validation and unique_objects support
24421 // for NV_dedicated_allocation
24422 uint32_t extension_count = 0;
24423 bool supports_nv_dedicated_allocation = false;
24424 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24425 ASSERT_VK_SUCCESS(err);
24426
24427 if (extension_count > 0) {
24428 std::vector<VkExtensionProperties> available_extensions(extension_count);
24429
24430 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24431 ASSERT_VK_SUCCESS(err);
24432
24433 for (const auto &extension_props : available_extensions) {
24434 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24435 supports_nv_dedicated_allocation = true;
24436 }
24437 }
24438 }
24439
24440 if (supports_nv_dedicated_allocation) {
24441 m_errorMonitor->ExpectSuccess();
24442
24443 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24444 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24445 dedicated_buffer_create_info.pNext = nullptr;
24446 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24447
24448 uint32_t queue_family_index = 0;
24449 VkBufferCreateInfo buffer_create_info = {};
24450 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24451 buffer_create_info.pNext = &dedicated_buffer_create_info;
24452 buffer_create_info.size = 1024;
24453 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24454 buffer_create_info.queueFamilyIndexCount = 1;
24455 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24456
24457 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070024458 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024459 ASSERT_VK_SUCCESS(err);
24460
24461 VkMemoryRequirements memory_reqs;
24462 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
24463
24464 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
24465 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
24466 dedicated_memory_info.pNext = nullptr;
24467 dedicated_memory_info.buffer = buffer;
24468 dedicated_memory_info.image = VK_NULL_HANDLE;
24469
24470 VkMemoryAllocateInfo memory_info = {};
24471 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
24472 memory_info.pNext = &dedicated_memory_info;
24473 memory_info.allocationSize = memory_reqs.size;
24474
24475 bool pass;
24476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
24477 ASSERT_TRUE(pass);
24478
24479 VkDeviceMemory buffer_memory;
24480 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
24481 ASSERT_VK_SUCCESS(err);
24482
24483 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
24484 ASSERT_VK_SUCCESS(err);
24485
24486 vkDestroyBuffer(m_device->device(), buffer, NULL);
24487 vkFreeMemory(m_device->device(), buffer_memory, NULL);
24488
24489 m_errorMonitor->VerifyNotFound();
24490 }
24491}
24492
24493TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
24494 VkResult err;
24495
24496 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
24497
Tony Barbour1fa09702017-03-16 12:09:08 -060024498 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24500
24501 std::vector<const char *> device_extension_names;
24502 auto features = m_device->phy().features();
24503 // Artificially disable support for non-solid fill modes
24504 features.fillModeNonSolid = false;
24505 // The sacrificial device object
24506 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
24507
24508 VkRenderpassObj render_pass(&test_device);
24509
24510 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24511 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24512 pipeline_layout_ci.setLayoutCount = 0;
24513 pipeline_layout_ci.pSetLayouts = NULL;
24514
24515 VkPipelineLayout pipeline_layout;
24516 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24517 ASSERT_VK_SUCCESS(err);
24518
24519 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24520 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24521 rs_ci.pNext = nullptr;
24522 rs_ci.lineWidth = 1.0f;
24523 rs_ci.rasterizerDiscardEnable = true;
24524
24525 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24526 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24527
24528 // Set polygonMode=FILL. No error is expected
24529 m_errorMonitor->ExpectSuccess();
24530 {
24531 VkPipelineObj pipe(&test_device);
24532 pipe.AddShader(&vs);
24533 pipe.AddShader(&fs);
24534 pipe.AddColorAttachment();
24535 // Set polygonMode to a good value
24536 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24537 pipe.SetRasterization(&rs_ci);
24538 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24539 }
24540 m_errorMonitor->VerifyNotFound();
24541
24542 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24543}
24544
Dave Houlton1150cf52017-04-27 14:38:11 -060024545TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024546 m_errorMonitor->ExpectSuccess();
24547
24548 ASSERT_NO_FATAL_FAILURE(Init());
24549 VkResult err;
24550
24551 std::vector<VkSemaphore> semaphores;
24552
24553 const int chainLength = 32768;
24554 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24555
24556 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024557 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024558 VkSemaphore semaphore;
24559 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24560 ASSERT_VK_SUCCESS(err);
24561
24562 semaphores.push_back(semaphore);
24563
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024564 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24565 nullptr,
24566 semaphores.size() > 1 ? 1u : 0u,
24567 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24568 &flags,
24569 0,
24570 nullptr,
24571 1,
24572 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024573 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24574 ASSERT_VK_SUCCESS(err);
24575 }
24576
Dave Houlton1150cf52017-04-27 14:38:11 -060024577 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024578 VkFence fence;
24579 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24580 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024581 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024582 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24583 ASSERT_VK_SUCCESS(err);
24584
24585 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24586
Dave Houlton1150cf52017-04-27 14:38:11 -060024587 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024588
24589 vkDestroyFence(m_device->device(), fence, nullptr);
24590
24591 m_errorMonitor->VerifyNotFound();
24592}
24593
Mike Stroyanca855662017-05-02 11:06:27 -060024594extern "C" void *ReleaseNullFence(void *arg) {
24595 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24596
24597 for (int i = 0; i < 40000; i++) {
24598 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24599 if (data->bailout) {
24600 break;
24601 }
24602 }
24603 return NULL;
24604}
24605
24606TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24607 test_platform_thread thread;
24608
24609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24610
24611 ASSERT_NO_FATAL_FAILURE(Init());
24612
24613 struct thread_data_struct data;
24614 data.device = m_device->device();
24615 data.bailout = false;
24616 m_errorMonitor->SetBailout(&data.bailout);
24617
24618 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24619 // There should be no validation error from collision of that non-object.
24620 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24621 for (int i = 0; i < 40000; i++) {
24622 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24623 }
24624 test_platform_thread_join(thread, NULL);
24625
24626 m_errorMonitor->SetBailout(NULL);
24627
24628 m_errorMonitor->VerifyNotFound();
24629}
24630
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024631#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024632TEST_F(VkPositiveLayerTest, LongFenceChain)
24633{
24634 m_errorMonitor->ExpectSuccess();
24635
Tony Barbour1fa09702017-03-16 12:09:08 -060024636 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024637 VkResult err;
24638
24639 std::vector<VkFence> fences;
24640
24641 const int chainLength = 32768;
24642
24643 for (int i = 0; i < chainLength; i++) {
24644 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24645 VkFence fence;
24646 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24647 ASSERT_VK_SUCCESS(err);
24648
24649 fences.push_back(fence);
24650
24651 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24652 0, nullptr, 0, nullptr };
24653 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24654 ASSERT_VK_SUCCESS(err);
24655
24656 }
24657
24658 // BOOM, stack overflow.
24659 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24660
24661 for (auto fence : fences)
24662 vkDestroyFence(m_device->device(), fence, nullptr);
24663
24664 m_errorMonitor->VerifyNotFound();
24665}
24666#endif
24667
Petr Kraus4d718682017-05-18 03:38:41 +020024668TEST_F(VkPositiveLayerTest, ClearColorImageWithValidRange) {
24669 TEST_DESCRIPTION("Record clear color with a valid VkImageSubresourceRange");
24670
24671 ASSERT_NO_FATAL_FAILURE(Init());
24672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24673
24674 VkImageObj image(m_device);
24675 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
24676 ASSERT_TRUE(image.create_info().arrayLayers == 1);
24677 ASSERT_TRUE(image.initialized());
24678 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
24679
24680 const VkClearColorValue clear_color = {{0.0f, 0.0f, 0.0f, 1.0f}};
24681
24682 m_commandBuffer->BeginCommandBuffer();
24683 const auto cb_handle = m_commandBuffer->GetBufferHandle();
24684
24685 // Try good case
24686 {
24687 m_errorMonitor->ExpectSuccess();
24688 VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
24689 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
24690 m_errorMonitor->VerifyNotFound();
24691 }
24692
24693 // Try good case with VK_REMAINING
24694 {
24695 m_errorMonitor->ExpectSuccess();
24696 VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS};
24697 vkCmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
24698 m_errorMonitor->VerifyNotFound();
24699 }
24700}
24701
24702TEST_F(VkPositiveLayerTest, ClearDepthStencilWithValidRange) {
24703 TEST_DESCRIPTION("Record clear depth with a valid VkImageSubresourceRange");
24704
24705 ASSERT_NO_FATAL_FAILURE(Init());
24706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24707
24708 auto depth_format = FindSupportedDepthStencilFormat(gpu());
24709 if (!depth_format) {
24710 printf(" No Depth + Stencil format found. Skipped.\n");
24711 return;
24712 }
24713
24714 VkImageObj image(m_device);
24715 image.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
24716 ASSERT_TRUE(image.create_info().arrayLayers == 1);
24717 ASSERT_TRUE(image.initialized());
24718 const VkImageAspectFlags ds_aspect = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
24719 image.SetLayout(ds_aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
24720
24721 const VkClearDepthStencilValue clear_value = {};
24722
24723 m_commandBuffer->BeginCommandBuffer();
24724 const auto cb_handle = m_commandBuffer->GetBufferHandle();
24725
24726 // Try good case
24727 {
24728 m_errorMonitor->ExpectSuccess();
24729 VkImageSubresourceRange range = {ds_aspect, 0, 1, 0, 1};
24730 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
24731 m_errorMonitor->VerifyNotFound();
24732 }
24733
24734 // Try good case with VK_REMAINING
24735 {
24736 m_errorMonitor->ExpectSuccess();
24737 VkImageSubresourceRange range = {ds_aspect, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS};
24738 vkCmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
24739 m_errorMonitor->VerifyNotFound();
24740 }
24741}
24742
Cody Northrop1242dfd2016-07-13 17:24:59 -060024743#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024744const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024745static bool initialized = false;
24746static bool active = false;
24747
24748// Convert Intents to argv
24749// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024750std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024751 std::vector<std::string> args;
24752 JavaVM &vm = *app.activity->vm;
24753 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024754 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024755
24756 JNIEnv &env = *p_env;
24757 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024758 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024759 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024760 jmethodID get_string_extra_method =
24761 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024762 jvalue get_string_extra_args;
24763 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024764 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024765
24766 std::string args_str;
24767 if (extra_str) {
24768 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24769 args_str = extra_utf;
24770 env.ReleaseStringUTFChars(extra_str, extra_utf);
24771 env.DeleteLocalRef(extra_str);
24772 }
24773
24774 env.DeleteLocalRef(get_string_extra_args.l);
24775 env.DeleteLocalRef(intent);
24776 vm.DetachCurrentThread();
24777
24778 // split args_str
24779 std::stringstream ss(args_str);
24780 std::string arg;
24781 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024782 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024783 }
24784
24785 return args;
24786}
24787
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024788void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24789 const char *const type_param = test_info.type_param();
24790 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024791
24792 if (type_param != NULL || value_param != NULL) {
24793 error_message.append(", where ");
24794 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024795 error_message.append("TypeParam = ").append(type_param);
24796 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024797 }
24798 if (value_param != NULL) {
24799 error_message.append("GetParam() = ").append(value_param);
24800 }
24801 }
24802}
24803
24804// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24805class LogcatPrinter : public ::testing::EmptyTestEventListener {
24806 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024807 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024808 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24809 }
24810
24811 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024812 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024813 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024814 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024815
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024816 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24817 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024818 }
24819
24820 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024821 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024822 std::string result;
24823 if (info.result()->Passed()) {
24824 result.append("[ OK ]");
24825 } else {
24826 result.append("[ FAILED ]");
24827 }
24828 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024829 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024830
24831 if (::testing::GTEST_FLAG(print_time)) {
24832 std::ostringstream os;
24833 os << info.result()->elapsed_time();
24834 result.append(" (").append(os.str()).append(" ms)");
24835 }
24836
24837 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24838 };
24839};
24840
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024841static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024842
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024843static void processCommand(struct android_app *app, int32_t cmd) {
24844 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024845 case APP_CMD_INIT_WINDOW: {
24846 if (app->window) {
24847 initialized = true;
24848 }
24849 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024850 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024851 case APP_CMD_GAINED_FOCUS: {
24852 active = true;
24853 break;
24854 }
24855 case APP_CMD_LOST_FOCUS: {
24856 active = false;
24857 break;
24858 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024859 }
24860}
24861
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024862void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024863 app_dummy();
24864
Cody Northrop1242dfd2016-07-13 17:24:59 -060024865 int vulkanSupport = InitVulkan();
24866 if (vulkanSupport == 0) {
24867 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24868 return;
24869 }
24870
24871 app->onAppCmd = processCommand;
24872 app->onInputEvent = processInput;
24873
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024874 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024875 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024876 struct android_poll_source *source;
24877 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024878 if (source) {
24879 source->process(app, source);
24880 }
24881
24882 if (app->destroyRequested != 0) {
24883 VkTestFramework::Finish();
24884 return;
24885 }
24886 }
24887
24888 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024889 // Use the following key to send arguments to gtest, i.e.
24890 // --es args "--gtest_filter=-VkLayerTest.foo"
24891 const char key[] = "args";
24892 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024894 std::string filter = "";
24895 if (args.size() > 0) {
24896 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24897 filter += args[0];
24898 } else {
24899 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24900 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024901
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024902 int argc = 2;
24903 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24904 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024905
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024906 // Route output to files until we can override the gtest output
24907 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24908 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024909
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024910 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024911
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024912 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024913 listeners.Append(new LogcatPrinter);
24914
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024915 VkTestFramework::InitArgs(&argc, argv);
24916 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024917
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024918 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024919
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024920 if (result != 0) {
24921 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24922 } else {
24923 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24924 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024926 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024927
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024928 fclose(stdout);
24929 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024931 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024932 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024933 }
24934 }
24935}
24936#endif
24937
Tony Barbour300a6082015-04-07 13:44:53 -060024938int main(int argc, char **argv) {
24939 int result;
24940
Cody Northrop8e54a402016-03-08 22:25:52 -070024941#ifdef ANDROID
24942 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024943 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024944#endif
24945
Tony Barbour300a6082015-04-07 13:44:53 -060024946 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024947 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024948
24949 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24950
24951 result = RUN_ALL_TESTS();
24952
Tony Barbour6918cd52015-04-09 12:58:51 -060024953 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024954 return result;
24955}