blob: 6a946480ad144fea2b785faf0672c22051deb9ba [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600341 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600343 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600344}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345
Karl Schultz6addd812016-02-02 17:17:23 -0700346class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700347 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600348 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
349 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700350 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600351 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
352 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 }
Tony Barbour300a6082015-04-07 13:44:53 -0600354
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600355 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
356 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600358 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700359 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600360 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600362 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
363 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
364 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700365 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
366 }
367 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
368 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
369 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600370 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
371 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
372 InitState(features, flags);
373 }
374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700375 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700376 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600377 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600378 std::vector<const char *> instance_layer_names;
379 std::vector<const char *> instance_extension_names;
380 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600381
382 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700383 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600384 /*
385 * Since CreateDbgMsgCallback is an instance level extension call
386 * any extension / layer that utilizes that feature also needs
387 * to be enabled at create instance time.
388 */
Karl Schultz6addd812016-02-02 17:17:23 -0700389 // Use Threading layer first to protect others from
390 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700391 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600392 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800393 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700394 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600395 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700396 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600397
Ian Elliott2c1daf52016-05-12 09:41:46 -0600398 if (m_enableWSI) {
399 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
400 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
401#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
402#if defined(VK_USE_PLATFORM_ANDROID_KHR)
403 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405#if defined(VK_USE_PLATFORM_MIR_KHR)
406 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700407#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600408#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
409 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_WIN32_KHR)
412 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_WIN32_KHR
414#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600415#if defined(VK_USE_PLATFORM_XCB_KHR)
416 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
417#elif defined(VK_USE_PLATFORM_XLIB_KHR)
418 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600420 }
421
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600423 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800424 this->app_info.pApplicationName = "layer_tests";
425 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600426 this->app_info.pEngineName = "unittest";
427 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600428 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600429
Tony Barbour15524c32015-04-29 17:34:29 -0600430 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600431 }
432
433 virtual void TearDown() {
434 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600435 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600436 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600438
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600439 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600440};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500441
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 // Create identity matrix
444 int i;
445 struct vktriangle_vs_uniform data;
446
447 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700448 glm::mat4 View = glm::mat4(1.0f);
449 glm::mat4 Model = glm::mat4(1.0f);
450 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700452 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 memcpy(&data.mvp, &MVP[0][0], matrixSize);
455
Karl Schultz6addd812016-02-02 17:17:23 -0700456 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600457 {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 -0500458 };
459
Karl Schultz6addd812016-02-02 17:17:23 -0700460 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461 data.position[i][0] = tri_data[i].posX;
462 data.position[i][1] = tri_data[i].posY;
463 data.position[i][2] = tri_data[i].posZ;
464 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700465 data.color[i][0] = tri_data[i].r;
466 data.color[i][1] = tri_data[i].g;
467 data.color[i][2] = tri_data[i].b;
468 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500469 }
470
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 ASSERT_NO_FATAL_FAILURE(InitViewport());
472
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200473 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
474 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475
Karl Schultz6addd812016-02-02 17:17:23 -0700476 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600477 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800480 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481 pipelineobj.AddShader(&vs);
482 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 if (failMask & BsoFailLineWidth) {
484 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600485 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600486 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600487 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
488 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 }
490 if (failMask & BsoFailDepthBias) {
491 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600492 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600493 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600495 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600496 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700498 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700499 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600500 if (failMask & BsoFailViewport) {
501 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
502 }
503 if (failMask & BsoFailScissor) {
504 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
505 }
506 if (failMask & BsoFailBlend) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600508 VkPipelineColorBlendAttachmentState att_state = {};
509 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
510 att_state.blendEnable = VK_TRUE;
511 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600512 }
513 if (failMask & BsoFailDepthBounds) {
514 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
515 }
516 if (failMask & BsoFailStencilReadMask) {
517 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
518 }
519 if (failMask & BsoFailStencilWriteMask) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
521 }
522 if (failMask & BsoFailStencilReference) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
524 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500525
526 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600527 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700530 m_commandBuffer->BeginCommandBuffer();
531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600536 if (failMask & BsoFailIndexBuffer) {
537 // Use DrawIndexed w/o an index buffer bound
538 DrawIndexed(3, 1, 0, 0, 0);
539 } else {
540 Draw(3, 1, 0, 0);
541 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500542
Mark Muellerd4914412016-06-13 17:52:06 -0600543 if (failMask & BsoFailCmdClearAttachments) {
544 VkClearAttachment color_attachment = {};
545 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700546 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600547 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
548
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600549 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600550 }
551
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700553 m_commandBuffer->EndRenderPass();
554 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600555 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500556}
557
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600558void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
559 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500560 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600563 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500564 }
565
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800566 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700567 // Make sure depthWriteEnable is set so that Depth fail test will work
568 // correctly
569 // Make sure stencilTestEnable is set so that Stencil fail test will work
570 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600571 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800572 stencil.failOp = VK_STENCIL_OP_KEEP;
573 stencil.passOp = VK_STENCIL_OP_KEEP;
574 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
575 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600576
577 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
578 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600579 ds_ci.pNext = NULL;
580 ds_ci.depthTestEnable = VK_FALSE;
581 ds_ci.depthWriteEnable = VK_TRUE;
582 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
583 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600584 if (failMask & BsoFailDepthBounds) {
585 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600586 ds_ci.maxDepthBounds = 0.0f;
587 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600588 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600589 ds_ci.stencilTestEnable = VK_TRUE;
590 ds_ci.front = stencil;
591 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600592
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600593 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600594 pipelineobj.SetViewport(m_viewports);
595 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600597 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600598 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 commandBuffer->BindPipeline(pipelineobj);
600 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500601}
602
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600603class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700604 public:
605 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600606};
607
Ian Elliott2c1daf52016-05-12 09:41:46 -0600608class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700609 public:
610 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600611 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600612};
613
Mark Muellerdfe37552016-07-07 14:47:42 -0600614class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600616 enum eTestEnFlags {
617 eDoubleDelete,
618 eInvalidDeviceOffset,
619 eInvalidMemoryOffset,
620 eBindNullBuffer,
621 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600622 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 };
624
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600625 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
628 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 return true;
630 }
631 VkDeviceSize offset_limit = 0;
632 if (eInvalidMemoryOffset == aTestFlag) {
633 VkBuffer vulkanBuffer;
634 VkBufferCreateInfo buffer_create_info = {};
635 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
636 buffer_create_info.size = 32;
637 buffer_create_info.usage = aBufferUsage;
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600640 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600641
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
644 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
646 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600647 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600651 }
652 if (eOffsetAlignment < offset_limit) {
653 return true;
654 }
655 return false;
656 }
657
658 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600659 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
660 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600661 if (eBindNullBuffer == aTestFlag) {
662 VulkanMemory = 0;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
664 } else {
665 VkBufferCreateInfo buffer_create_info = {};
666 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
667 buffer_create_info.size = 32;
668 buffer_create_info.usage = aBufferUsage;
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
672 CreateCurrent = true;
673
674 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600676
677 VkMemoryAllocateInfo memory_allocate_info = {};
678 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800679 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
681 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682 if (!pass) {
683 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
684 return;
685 }
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 AllocateCurrent = true;
689 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600690 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
691 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600692 BoundCurrent = true;
693
694 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
695 }
696 }
697
698 ~VkBufferTest() {
699 if (CreateCurrent) {
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702 if (AllocateCurrent) {
703 if (InvalidDeleteEn) {
704 union {
705 VkDeviceMemory device_memory;
706 unsigned long long index_access;
707 } bad_index;
708
709 bad_index.device_memory = VulkanMemory;
710 bad_index.index_access++;
711
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600712 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600713 }
714 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
715 }
716 }
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600719
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600721
722 void TestDoubleDestroy() {
723 // Destroy the buffer but leave the flag set, which will cause
724 // the buffer to be destroyed again in the destructor.
725 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
726 }
727
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600729 bool AllocateCurrent;
730 bool BoundCurrent;
731 bool CreateCurrent;
732 bool InvalidDeleteEn;
733
734 VkBuffer VulkanBuffer;
735 VkDevice VulkanDevice;
736 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600737};
738
739class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700740 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600741 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600742 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700743 : BoundCurrent(false),
744 AttributeCount(aAttributeCount),
745 BindingCount(aBindingCount),
746 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600748 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
749 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700750 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600751
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600752 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
753 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
756 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
757 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
758 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
759 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
761 unsigned i = 0;
762 do {
763 VertexInputAttributeDescription[i].binding = BindId;
764 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600765 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
766 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 i++;
768 } while (AttributeCount < i);
769
770 i = 0;
771 do {
772 VertexInputBindingDescription[i].binding = BindId;
773 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600775 i++;
776 } while (BindingCount < i);
777 }
778
779 ~VkVerticesObj() {
780 if (VertexInputAttributeDescription) {
781 delete[] VertexInputAttributeDescription;
782 }
783 if (VertexInputBindingDescription) {
784 delete[] VertexInputBindingDescription;
785 }
786 }
787
788 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
790 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600791 return true;
792 }
793
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600794 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600795 VkDeviceSize *offsetList;
796 unsigned offsetCount;
797
798 if (aOffsetCount) {
799 offsetList = aOffsetList;
800 offsetCount = aOffsetCount;
801 } else {
802 offsetList = new VkDeviceSize[1]();
803 offsetCount = 1;
804 }
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600807 BoundCurrent = true;
808
809 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600810 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600811 }
812 }
813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700814 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600815 static uint32_t BindIdGenerator;
816
817 bool BoundCurrent;
818 unsigned AttributeCount;
819 unsigned BindingCount;
820 uint32_t BindId;
821
822 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
823 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
824 VkVertexInputBindingDescription *VertexInputBindingDescription;
825 VkConstantBufferObj VulkanMemoryBuffer;
826};
827
828uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500829// ********************************************************************************************************************
830// ********************************************************************************************************************
831// ********************************************************************************************************************
832// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600833TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700834 TEST_DESCRIPTION(
835 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
836 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837
Tony Barbour1fa09702017-03-16 12:09:08 -0600838 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
848 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 // Specify NULL for pointer to array count
850 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600851 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600852 m_errorMonitor->VerifyFound();
853
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify 0 for a required array count
856 // Expected to trigger an error with parameter_validation::validate_array
857 VkViewport view_port = {};
858 m_commandBuffer->SetViewport(0, 0, &view_port);
859 m_errorMonitor->VerifyFound();
860
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600862 // Specify NULL for a required array
863 // Expected to trigger an error with parameter_validation::validate_array
864 m_commandBuffer->SetViewport(0, 1, NULL);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify VK_NULL_HANDLE for a required handle
869 // Expected to trigger an error with
870 // parameter_validation::validate_required_handle
871 vkUnmapMemory(device(), VK_NULL_HANDLE);
872 m_errorMonitor->VerifyFound();
873
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
875 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600876 // Specify VK_NULL_HANDLE for a required handle array entry
877 // Expected to trigger an error with
878 // parameter_validation::validate_required_handle_array
879 VkFence fence = VK_NULL_HANDLE;
880 vkResetFences(device(), 1, &fence);
881 m_errorMonitor->VerifyFound();
882
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600884 // Specify NULL for a required struct pointer
885 // Expected to trigger an error with
886 // parameter_validation::validate_struct_type
887 VkDeviceMemory memory = VK_NULL_HANDLE;
888 vkAllocateMemory(device(), NULL, NULL, &memory);
889 m_errorMonitor->VerifyFound();
890
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600892 // Specify 0 for a required VkFlags parameter
893 // Expected to trigger an error with parameter_validation::validate_flags
894 m_commandBuffer->SetStencilReference(0, 0);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 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 -0600898 // Specify 0 for a required VkFlags array entry
899 // Expected to trigger an error with
900 // parameter_validation::validate_flags_array
901 VkSemaphore semaphore = VK_NULL_HANDLE;
902 VkPipelineStageFlags stageFlags = 0;
903 VkSubmitInfo submitInfo = {};
904 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
905 submitInfo.waitSemaphoreCount = 1;
906 submitInfo.pWaitSemaphores = &semaphore;
907 submitInfo.pWaitDstStageMask = &stageFlags;
908 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
909 m_errorMonitor->VerifyFound();
910}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600911
Dustin Gravesfce74c02016-05-10 11:42:58 -0600912TEST_F(VkLayerTest, ReservedParameter) {
913 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
914
Tony Barbour1fa09702017-03-16 12:09:08 -0600915 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918 // Specify 0 for a reserved VkFlags parameter
919 // Expected to trigger an error with
920 // parameter_validation::validate_reserved_flags
921 VkEvent event_handle = VK_NULL_HANDLE;
922 VkEventCreateInfo event_info = {};
923 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
924 event_info.flags = 1;
925 vkCreateEvent(device(), &event_info, NULL, &event_handle);
926 m_errorMonitor->VerifyFound();
927}
928
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700930 TEST_DESCRIPTION(
931 "Specify an invalid VkStructureType for a Vulkan "
932 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600933
Tony Barbour1fa09702017-03-16 12:09:08 -0600934 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600937 // Zero struct memory, effectively setting sType to
938 // VK_STRUCTURE_TYPE_APPLICATION_INFO
939 // Expected to trigger an error with
940 // parameter_validation::validate_struct_type
941 VkMemoryAllocateInfo alloc_info = {};
942 VkDeviceMemory memory = VK_NULL_HANDLE;
943 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
944 m_errorMonitor->VerifyFound();
945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600947 // Zero struct memory, effectively setting sType to
948 // VK_STRUCTURE_TYPE_APPLICATION_INFO
949 // Expected to trigger an error with
950 // parameter_validation::validate_struct_type_array
951 VkSubmitInfo submit_info = {};
952 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
953 m_errorMonitor->VerifyFound();
954}
955
956TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600957 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600958
Tony Barbour1fa09702017-03-16 12:09:08 -0600959 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600960
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600962 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600963 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600965 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600966 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600967 // Zero-initialization will provide the correct sType
968 VkApplicationInfo app_info = {};
969 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
970 event_alloc_info.pNext = &app_info;
971 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
975 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600976 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
977 // a function that has allowed pNext structure types and specify
978 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600979 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600980 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600981 VkMemoryAllocateInfo memory_alloc_info = {};
982 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 memory_alloc_info.pNext = &app_info;
984 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600985 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986}
Dustin Graves5d33d532016-05-09 16:21:12 -0600987
988TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990
Tony Barbour1fa09702017-03-16 12:09:08 -0600991 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
994 "does not fall within the begin..end "
995 "range of the core VkFormat "
996 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkFormat value
998 // Expected to trigger an error with
999 // parameter_validation::validate_ranged_enum
1000 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001001 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001002 m_errorMonitor->VerifyFound();
1003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001004 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 -06001005 // Specify an invalid VkFlags bitmask value
1006 // Expected to trigger an error with parameter_validation::validate_flags
1007 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001008 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1009 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001010 m_errorMonitor->VerifyFound();
1011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001012 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 -06001013 // Specify an invalid VkFlags array entry
1014 // Expected to trigger an error with
1015 // parameter_validation::validate_flags_array
1016 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001017 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001018 VkSubmitInfo submit_info = {};
1019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1020 submit_info.waitSemaphoreCount = 1;
1021 submit_info.pWaitSemaphores = &semaphore;
1022 submit_info.pWaitDstStageMask = &stage_flags;
1023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1024 m_errorMonitor->VerifyFound();
1025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001027 // Specify an invalid VkBool32 value
1028 // Expected to trigger a warning with
1029 // parameter_validation::validate_bool32
1030 VkSampler sampler = VK_NULL_HANDLE;
1031 VkSamplerCreateInfo sampler_info = {};
1032 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1033 sampler_info.pNext = NULL;
1034 sampler_info.magFilter = VK_FILTER_NEAREST;
1035 sampler_info.minFilter = VK_FILTER_NEAREST;
1036 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1037 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1038 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1039 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1040 sampler_info.mipLodBias = 1.0;
1041 sampler_info.maxAnisotropy = 1;
1042 sampler_info.compareEnable = VK_FALSE;
1043 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1044 sampler_info.minLod = 1.0;
1045 sampler_info.maxLod = 1.0;
1046 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1047 sampler_info.unnormalizedCoordinates = VK_FALSE;
1048 // Not VK_TRUE or VK_FALSE
1049 sampler_info.anisotropyEnable = 3;
1050 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1051 m_errorMonitor->VerifyFound();
1052}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053
1054TEST_F(VkLayerTest, FailedReturnValue) {
1055 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1056
Tony Barbour1fa09702017-03-16 12:09:08 -06001057 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001058
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001059 // Find an unsupported image format
1060 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1061 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1062 VkFormat format = static_cast<VkFormat>(f);
1063 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001064 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 unsupported = format;
1066 break;
1067 }
1068 }
1069
1070 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1072 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001073 // Specify an unsupported VkFormat value to generate a
1074 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1075 // Expected to trigger a warning from
1076 // parameter_validation::validate_result
1077 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1079 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001080 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1081 m_errorMonitor->VerifyFound();
1082 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001083}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084
1085TEST_F(VkLayerTest, UpdateBufferAlignment) {
1086 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088
Tony Barbour1fa09702017-03-16 12:09:08 -06001089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1092 vk_testing::Buffer buffer;
1093 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1094
Tony Barbour552f6c02016-12-21 14:34:07 -07001095 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001098 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1099 m_errorMonitor->VerifyFound();
1100
1101 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001103 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1104 m_errorMonitor->VerifyFound();
1105
1106 // Introduce failure by using dataSize that is < 0
1107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is > 65536
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1116 m_errorMonitor->VerifyFound();
1117
Tony Barbour552f6c02016-12-21 14:34:07 -07001118 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119}
1120
1121TEST_F(VkLayerTest, FillBufferAlignment) {
1122 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1123
Tony Barbour1fa09702017-03-16 12:09:08 -06001124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125
1126 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1127 vk_testing::Buffer buffer;
1128 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1129
Tony Barbour552f6c02016-12-21 14:34:07 -07001130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001134 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1135 m_errorMonitor->VerifyFound();
1136
1137 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001139 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1140 m_errorMonitor->VerifyFound();
1141
1142 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001144 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1145 m_errorMonitor->VerifyFound();
1146
Tony Barbour552f6c02016-12-21 14:34:07 -07001147 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001148}
Dustin Graves40f35822016-06-23 11:12:53 -06001149
Cortd889ff92016-07-27 09:51:27 -07001150TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1151 VkResult err;
1152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001153 TEST_DESCRIPTION(
1154 "Attempt to use a non-solid polygon fill mode in a "
1155 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001156
Tony Barbour1fa09702017-03-16 12:09:08 -06001157 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1159
1160 std::vector<const char *> device_extension_names;
1161 auto features = m_device->phy().features();
1162 // Artificially disable support for non-solid fill modes
1163 features.fillModeNonSolid = false;
1164 // The sacrificial device object
1165 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1166
1167 VkRenderpassObj render_pass(&test_device);
1168
1169 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1170 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1171 pipeline_layout_ci.setLayoutCount = 0;
1172 pipeline_layout_ci.pSetLayouts = NULL;
1173
1174 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001175 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001176 ASSERT_VK_SUCCESS(err);
1177
1178 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1179 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1180 rs_ci.pNext = nullptr;
1181 rs_ci.lineWidth = 1.0f;
1182 rs_ci.rasterizerDiscardEnable = true;
1183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001184 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1185 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001186
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001187 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
1202 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1204 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001205 {
1206 VkPipelineObj pipe(&test_device);
1207 pipe.AddShader(&vs);
1208 pipe.AddShader(&fs);
1209 pipe.AddColorAttachment();
1210 // Introduce failure by setting unsupported polygon mode
1211 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1212 pipe.SetRasterization(&rs_ci);
1213 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1214 }
1215 m_errorMonitor->VerifyFound();
1216
Cortd889ff92016-07-27 09:51:27 -07001217 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1218}
1219
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001220#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001221TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001222{
1223 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001224 VkFenceCreateInfo fenceInfo = {};
1225 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1226 fenceInfo.pNext = NULL;
1227 fenceInfo.flags = 0;
1228
Mike Weiblencce7ec72016-10-17 19:33:05 -06001229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001230
Tony Barbour1fa09702017-03-16 12:09:08 -06001231 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001232
1233 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1234 vk_testing::Buffer buffer;
1235 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Tony Barbourfe3351b2015-07-28 10:17:20 -06001237 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001238 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001239 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240
1241 testFence.init(*m_device, fenceInfo);
1242
1243 // Bypass framework since it does the waits automatically
1244 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1247 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001248 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001249 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001250 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001251 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001253 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001254 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001255
1256 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257 ASSERT_VK_SUCCESS( err );
1258
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001259 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001260 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001262 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263}
1264
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001266{
1267 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001268 VkFenceCreateInfo fenceInfo = {};
1269 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1270 fenceInfo.pNext = NULL;
1271 fenceInfo.flags = 0;
1272
Mike Weiblencce7ec72016-10-17 19:33:05 -06001273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274
Tony Barbour1fa09702017-03-16 12:09:08 -06001275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001276 ASSERT_NO_FATAL_FAILURE(InitViewport());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1278
Tony Barbourfe3351b2015-07-28 10:17:20 -06001279 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001280 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001281 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282
1283 testFence.init(*m_device, fenceInfo);
1284
1285 // Bypass framework since it does the waits automatically
1286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001296 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001297
1298 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299 ASSERT_VK_SUCCESS( err );
1300
Jon Ashburnf19916e2016-01-11 13:12:43 -07001301 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001302 VkCommandBufferBeginInfo info = {};
1303 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1304 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001305 info.renderPass = VK_NULL_HANDLE;
1306 info.subpass = 0;
1307 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001308 info.occlusionQueryEnable = VK_FALSE;
1309 info.queryFlags = 0;
1310 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311
1312 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001313 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001315 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001316}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001317#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001318
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001319TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1320 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1321
Tony Barbour1fa09702017-03-16 12:09:08 -06001322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001323
1324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1325 VkBuffer buffer;
1326 VkBufferCreateInfo buf_info = {};
1327 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1328 buf_info.pNext = NULL;
1329 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1330 buf_info.size = 2048;
1331 buf_info.queueFamilyIndexCount = 0;
1332 buf_info.pQueueFamilyIndices = NULL;
1333 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1334 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1335 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1336 m_errorMonitor->VerifyFound();
1337
1338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1339 VkImage image;
1340 VkImageCreateInfo image_create_info = {};
1341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1342 image_create_info.pNext = NULL;
1343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1344 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1345 image_create_info.extent.width = 512;
1346 image_create_info.extent.height = 64;
1347 image_create_info.extent.depth = 1;
1348 image_create_info.mipLevels = 1;
1349 image_create_info.arrayLayers = 1;
1350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1352 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1354 image_create_info.queueFamilyIndexCount = 0;
1355 image_create_info.pQueueFamilyIndices = NULL;
1356 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1357 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1358 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1359 m_errorMonitor->VerifyFound();
1360}
1361
Dave Houlton829c0d82017-01-24 15:09:17 -07001362TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1363 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1364
1365 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001366 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001367 ASSERT_NO_FATAL_FAILURE(
1368 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001369 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001370
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001371 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 device_features.sparseResidencyImage2D = VK_FALSE;
1373 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001374 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001375
1376 VkImage image = VK_NULL_HANDLE;
1377 VkResult result = VK_RESULT_MAX_ENUM;
1378 VkImageCreateInfo image_create_info = {};
1379 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1380 image_create_info.pNext = NULL;
1381 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1382 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1383 image_create_info.extent.width = 512;
1384 image_create_info.extent.height = 1;
1385 image_create_info.extent.depth = 1;
1386 image_create_info.mipLevels = 1;
1387 image_create_info.arrayLayers = 1;
1388 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1389 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1390 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1391 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1392 image_create_info.queueFamilyIndexCount = 0;
1393 image_create_info.pQueueFamilyIndices = NULL;
1394 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1395 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1396
1397 // 1D image w/ sparse residency is an error
1398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1399 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1400 m_errorMonitor->VerifyFound();
1401 if (VK_SUCCESS == result) {
1402 vkDestroyImage(m_device->device(), image, NULL);
1403 image = VK_NULL_HANDLE;
1404 }
1405
1406 // 2D image w/ sparse residency when feature isn't available
1407 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1408 image_create_info.extent.height = 64;
1409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1410 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1411 m_errorMonitor->VerifyFound();
1412 if (VK_SUCCESS == result) {
1413 vkDestroyImage(m_device->device(), image, NULL);
1414 image = VK_NULL_HANDLE;
1415 }
1416
1417 // 3D image w/ sparse residency when feature isn't available
1418 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1419 image_create_info.extent.depth = 8;
1420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1421 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1422 m_errorMonitor->VerifyFound();
1423 if (VK_SUCCESS == result) {
1424 vkDestroyImage(m_device->device(), image, NULL);
1425 image = VK_NULL_HANDLE;
1426 }
1427}
1428
1429TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1430 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1431
1432 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001433 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001434 ASSERT_NO_FATAL_FAILURE(
1435 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001436 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001437
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001438 // These tests require that the device support sparse residency for 2D images
1439 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1440 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001441 return;
1442 }
1443
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001444 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001445 device_features.sparseResidency2Samples = VK_FALSE;
1446 device_features.sparseResidency4Samples = VK_FALSE;
1447 device_features.sparseResidency8Samples = VK_FALSE;
1448 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001449 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001450
1451 VkImage image = VK_NULL_HANDLE;
1452 VkResult result = VK_RESULT_MAX_ENUM;
1453 VkImageCreateInfo image_create_info = {};
1454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1455 image_create_info.pNext = NULL;
1456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1457 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1458 image_create_info.extent.width = 64;
1459 image_create_info.extent.height = 64;
1460 image_create_info.extent.depth = 1;
1461 image_create_info.mipLevels = 1;
1462 image_create_info.arrayLayers = 1;
1463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1465 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1466 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1467 image_create_info.queueFamilyIndexCount = 0;
1468 image_create_info.pQueueFamilyIndices = NULL;
1469 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1470 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1471
1472 // 2D image w/ sparse residency and linear tiling is an error
1473 m_errorMonitor->SetDesiredFailureMsg(
1474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1475 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1476 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1477 m_errorMonitor->VerifyFound();
1478 if (VK_SUCCESS == result) {
1479 vkDestroyImage(m_device->device(), image, NULL);
1480 image = VK_NULL_HANDLE;
1481 }
1482 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1483
1484 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1485 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1487 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1488 m_errorMonitor->VerifyFound();
1489 if (VK_SUCCESS == result) {
1490 vkDestroyImage(m_device->device(), image, NULL);
1491 image = VK_NULL_HANDLE;
1492 }
1493
1494 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1496 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1497 m_errorMonitor->VerifyFound();
1498 if (VK_SUCCESS == result) {
1499 vkDestroyImage(m_device->device(), image, NULL);
1500 image = VK_NULL_HANDLE;
1501 }
1502
1503 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
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
1512 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1514 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1515 m_errorMonitor->VerifyFound();
1516 if (VK_SUCCESS == result) {
1517 vkDestroyImage(m_device->device(), image, NULL);
1518 image = VK_NULL_HANDLE;
1519 }
1520}
1521
Tobin Ehlisf11be982016-05-11 13:52:53 -06001522TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001523 TEST_DESCRIPTION(
1524 "Create a buffer and image, allocate memory, and bind the "
1525 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526 VkResult err;
1527 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001529
Tobin Ehlis077ded32016-05-12 17:39:13 -06001530 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001531 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001532 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001533 VkDeviceMemory mem; // buffer will be bound first
1534 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001535 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001536 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537
1538 VkBufferCreateInfo buf_info = {};
1539 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1540 buf_info.pNext = NULL;
1541 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1542 buf_info.size = 256;
1543 buf_info.queueFamilyIndexCount = 0;
1544 buf_info.pQueueFamilyIndices = NULL;
1545 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1546 buf_info.flags = 0;
1547 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1548 ASSERT_VK_SUCCESS(err);
1549
Tobin Ehlis077ded32016-05-12 17:39:13 -06001550 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
1552 VkImageCreateInfo image_create_info = {};
1553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1554 image_create_info.pNext = NULL;
1555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1556 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1557 image_create_info.extent.width = 64;
1558 image_create_info.extent.height = 64;
1559 image_create_info.extent.depth = 1;
1560 image_create_info.mipLevels = 1;
1561 image_create_info.arrayLayers = 1;
1562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001563 // Image tiling must be optimal to trigger error when aliasing linear buffer
1564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001565 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1566 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1567 image_create_info.queueFamilyIndexCount = 0;
1568 image_create_info.pQueueFamilyIndices = NULL;
1569 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1570 image_create_info.flags = 0;
1571
Tobin Ehlisf11be982016-05-11 13:52:53 -06001572 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1573 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1575 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001576
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1578
1579 VkMemoryAllocateInfo alloc_info = {};
1580 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1581 alloc_info.pNext = NULL;
1582 alloc_info.memoryTypeIndex = 0;
1583 // Ensure memory is big enough for both bindings
1584 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001585 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1586 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001588 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001589 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001590 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 return;
1592 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1594 ASSERT_VK_SUCCESS(err);
1595 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1596 ASSERT_VK_SUCCESS(err);
1597
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1599
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001601 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001602 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1603 m_errorMonitor->VerifyFound();
1604
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001606 // aliasing buffer2
1607 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1608 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001609 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1610 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001612 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001614 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001615 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001616 m_errorMonitor->VerifyFound();
1617
1618 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001619 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001620 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001621 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 vkFreeMemory(m_device->device(), mem, NULL);
1623 vkFreeMemory(m_device->device(), mem_img, NULL);
1624}
1625
Tobin Ehlis35372522016-05-12 08:32:31 -06001626TEST_F(VkLayerTest, InvalidMemoryMapping) {
1627 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1628 VkResult err;
1629 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001631
1632 VkBuffer buffer;
1633 VkDeviceMemory mem;
1634 VkMemoryRequirements mem_reqs;
1635
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001636 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1637
Tobin Ehlis35372522016-05-12 08:32:31 -06001638 VkBufferCreateInfo buf_info = {};
1639 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1640 buf_info.pNext = NULL;
1641 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1642 buf_info.size = 256;
1643 buf_info.queueFamilyIndexCount = 0;
1644 buf_info.pQueueFamilyIndices = NULL;
1645 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1646 buf_info.flags = 0;
1647 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1648 ASSERT_VK_SUCCESS(err);
1649
1650 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1651 VkMemoryAllocateInfo alloc_info = {};
1652 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1653 alloc_info.pNext = NULL;
1654 alloc_info.memoryTypeIndex = 0;
1655
1656 // Ensure memory is big enough for both bindings
1657 static const VkDeviceSize allocation_size = 0x10000;
1658 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 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 -06001660 if (!pass) {
1661 vkDestroyBuffer(m_device->device(), buffer, NULL);
1662 return;
1663 }
1664 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1665 ASSERT_VK_SUCCESS(err);
1666
1667 uint8_t *pData;
1668 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001669 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 -06001670 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1671 m_errorMonitor->VerifyFound();
1672 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001673 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1676 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1677 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001678 m_errorMonitor->VerifyFound();
1679
1680 // Unmap the memory to avoid re-map error
1681 vkUnmapMemory(m_device->device(), mem);
1682 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1685 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001686 m_errorMonitor->VerifyFound();
1687 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1689 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001690 m_errorMonitor->VerifyFound();
1691 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001693 vkUnmapMemory(m_device->device(), mem);
1694 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001697 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001698 ASSERT_VK_SUCCESS(err);
1699 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001700 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001701 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1705 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001706
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 // Now flush range that oversteps mapped range
1708 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001709 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001711 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001712 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1714 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1715 m_errorMonitor->VerifyFound();
1716
1717 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1718 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001719 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001720 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001721 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001722 mmr.size = VK_WHOLE_SIZE;
1723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001724 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1725 m_errorMonitor->VerifyFound();
1726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001727#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001728 // Some platforms have an atomsize of 1 which makes the test meaningless
1729 if (atom_size > 3) {
1730 // Now with an offset NOT a multiple of the device limit
1731 vkUnmapMemory(m_device->device(), mem);
1732 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1733 ASSERT_VK_SUCCESS(err);
1734 mmr.offset = 3; // Not a multiple of atom_size
1735 mmr.size = VK_WHOLE_SIZE;
1736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1737 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1738 m_errorMonitor->VerifyFound();
1739
1740 // Now with a size NOT a multiple of the device limit
1741 vkUnmapMemory(m_device->device(), mem);
1742 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1743 ASSERT_VK_SUCCESS(err);
1744 mmr.offset = atom_size;
1745 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1747 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1748 m_errorMonitor->VerifyFound();
1749 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001750#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1752 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001753 if (!pass) {
1754 vkFreeMemory(m_device->device(), mem, NULL);
1755 vkDestroyBuffer(m_device->device(), buffer, NULL);
1756 return;
1757 }
1758 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1759 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1760
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 vkFreeMemory(m_device->device(), mem, NULL);
1763}
1764
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001765#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001766TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1767 VkResult err;
1768 bool pass;
1769
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001770 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1771 // following declaration (which is temporarily being moved below):
1772 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001773 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001774 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001775 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001777 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001778 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001779
Tony Barbour1fa09702017-03-16 12:09:08 -06001780 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001781
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1783#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1784 // Use the functions from the VK_KHR_android_surface extension without
1785 // enabling that extension:
1786
1787 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001788 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1790 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001791 pass = (err != VK_SUCCESS);
1792 ASSERT_TRUE(pass);
1793 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001794#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001795
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796#if defined(VK_USE_PLATFORM_MIR_KHR)
1797 // Use the functions from the VK_KHR_mir_surface extension without enabling
1798 // that extension:
1799
1800 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001801 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001803 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1804 pass = (err != VK_SUCCESS);
1805 ASSERT_TRUE(pass);
1806 m_errorMonitor->VerifyFound();
1807
1808 // Tell whether an mir_connection supports presentation:
1809 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1811 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001812 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001813#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1816 // Use the functions from the VK_KHR_wayland_surface extension without
1817 // enabling that extension:
1818
1819 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001820 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1822 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 pass = (err != VK_SUCCESS);
1824 ASSERT_TRUE(pass);
1825 m_errorMonitor->VerifyFound();
1826
1827 // Tell whether an wayland_display supports presentation:
1828 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1830 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001831 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001832#endif // VK_USE_PLATFORM_WAYLAND_KHR
1833#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001834
Ian Elliott3f06ce52016-04-29 14:46:21 -06001835#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001836 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1837 // TO NON-LINUX PLATFORMS:
1838 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001839 // Use the functions from the VK_KHR_win32_surface extension without
1840 // enabling that extension:
1841
1842 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001843 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1845 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001846 pass = (err != VK_SUCCESS);
1847 ASSERT_TRUE(pass);
1848 m_errorMonitor->VerifyFound();
1849
1850 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001852 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001853 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001854// Set this (for now, until all platforms are supported and tested):
1855#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001856#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001857#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001858 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1859 // TO NON-LINUX PLATFORMS:
1860 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001861#endif
1862#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1864 // that extension:
1865
1866 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001867 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1870 pass = (err != VK_SUCCESS);
1871 ASSERT_TRUE(pass);
1872 m_errorMonitor->VerifyFound();
1873
1874 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001875 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001876 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1878 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001879 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001880// Set this (for now, until all platforms are supported and tested):
1881#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001882#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott12630812016-04-29 14:35:43 -06001884#if defined(VK_USE_PLATFORM_XLIB_KHR)
1885 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1886 // that extension:
1887
1888 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001889 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001891 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1892 pass = (err != VK_SUCCESS);
1893 ASSERT_TRUE(pass);
1894 m_errorMonitor->VerifyFound();
1895
1896 // Tell whether an Xlib VisualID supports presentation:
1897 Display *dpy = NULL;
1898 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001900 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1901 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001902// Set this (for now, until all platforms are supported and tested):
1903#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001904#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001905
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001906// Use the functions from the VK_KHR_surface extension without enabling
1907// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001908
Ian Elliott489eec02016-05-05 14:12:44 -06001909#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001910 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001912 vkDestroySurfaceKHR(instance(), surface, NULL);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check if surface supports presentation:
1916 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1919 pass = (err != VK_SUCCESS);
1920 ASSERT_TRUE(pass);
1921 m_errorMonitor->VerifyFound();
1922
1923 // Check surface capabilities:
1924 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1926 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001927 pass = (err != VK_SUCCESS);
1928 ASSERT_TRUE(pass);
1929 m_errorMonitor->VerifyFound();
1930
1931 // Check surface formats:
1932 uint32_t format_count = 0;
1933 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1935 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001936 pass = (err != VK_SUCCESS);
1937 ASSERT_TRUE(pass);
1938 m_errorMonitor->VerifyFound();
1939
1940 // Check surface present modes:
1941 uint32_t present_mode_count = 0;
1942 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1944 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001945 pass = (err != VK_SUCCESS);
1946 ASSERT_TRUE(pass);
1947 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001948#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001949
Ian Elliott1c32c772016-04-28 14:47:13 -06001950 // Use the functions from the VK_KHR_swapchain extension without enabling
1951 // that extension:
1952
1953 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001955 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1956 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001957 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 pass = (err != VK_SUCCESS);
1959 ASSERT_TRUE(pass);
1960 m_errorMonitor->VerifyFound();
1961
1962 // Get the images from the swapchain:
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 = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001965 pass = (err != VK_SUCCESS);
1966 ASSERT_TRUE(pass);
1967 m_errorMonitor->VerifyFound();
1968
Chris Forbeseb7d5502016-09-13 18:19:21 +12001969 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1970 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1971 VkFence fence;
1972 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1973
Ian Elliott1c32c772016-04-28 14:47:13 -06001974 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001976 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001977 pass = (err != VK_SUCCESS);
1978 ASSERT_TRUE(pass);
1979 m_errorMonitor->VerifyFound();
1980
Chris Forbeseb7d5502016-09-13 18:19:21 +12001981 vkDestroyFence(m_device->device(), fence, nullptr);
1982
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001984 //
1985 // NOTE: Currently can't test this because a real swapchain is needed (as
1986 // opposed to the fake one we created) in order for the layer to lookup the
1987 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001988
1989 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001991 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1992 m_errorMonitor->VerifyFound();
1993}
Chris Forbes09368e42016-10-13 11:59:22 +13001994#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001995
Karl Schultz6addd812016-02-02 17:17:23 -07001996TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1997 VkResult err;
1998 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2001 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002002
Tony Barbour1fa09702017-03-16 12:09:08 -06002003 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002004
2005 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002006 VkImage image;
2007 VkDeviceMemory mem;
2008 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Karl Schultz6addd812016-02-02 17:17:23 -07002010 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2011 const int32_t tex_width = 32;
2012 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013
Tony Barboureb254902015-07-15 12:50:33 -06002014 VkImageCreateInfo image_create_info = {};
2015 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 image_create_info.pNext = NULL;
2017 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2018 image_create_info.format = tex_format;
2019 image_create_info.extent.width = tex_width;
2020 image_create_info.extent.height = tex_height;
2021 image_create_info.extent.depth = 1;
2022 image_create_info.mipLevels = 1;
2023 image_create_info.arrayLayers = 1;
2024 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2025 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2026 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2027 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002028 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002029
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002030 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002031 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002032 mem_alloc.pNext = NULL;
2033 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002034
Chia-I Wuf7458c52015-10-26 21:10:41 +08002035 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002036 ASSERT_VK_SUCCESS(err);
2037
Karl Schultz6addd812016-02-02 17:17:23 -07002038 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039
Mark Lobodzinski23065352015-05-29 09:32:35 -05002040 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002041
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002042 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 -07002043 if (!pass) { // If we can't find any unmappable memory this test doesn't
2044 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002046 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002047 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002048
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002050 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002051 ASSERT_VK_SUCCESS(err);
2052
2053 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002054 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 ASSERT_VK_SUCCESS(err);
2056
2057 // Map memory as if to initialize the image
2058 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002059 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002061 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002062
Chia-I Wuf7458c52015-10-26 21:10:41 +08002063 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002064 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002065}
2066
Karl Schultz6addd812016-02-02 17:17:23 -07002067TEST_F(VkLayerTest, RebindMemory) {
2068 VkResult err;
2069 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002072
Tony Barbour1fa09702017-03-16 12:09:08 -06002073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
2075 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002076 VkImage image;
2077 VkDeviceMemory mem1;
2078 VkDeviceMemory mem2;
2079 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2082 const int32_t tex_width = 32;
2083 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002084
Tony Barboureb254902015-07-15 12:50:33 -06002085 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002086 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2087 image_create_info.pNext = NULL;
2088 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2089 image_create_info.format = tex_format;
2090 image_create_info.extent.width = tex_width;
2091 image_create_info.extent.height = tex_height;
2092 image_create_info.extent.depth = 1;
2093 image_create_info.mipLevels = 1;
2094 image_create_info.arrayLayers = 1;
2095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2096 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2097 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2098 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002100 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002101 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2102 mem_alloc.pNext = NULL;
2103 mem_alloc.allocationSize = 0;
2104 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002105
Karl Schultz6addd812016-02-02 17:17:23 -07002106 // Introduce failure, do NOT set memProps to
2107 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002108 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002113
2114 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002116 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002117
2118 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002119 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002120 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002121 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002122 ASSERT_VK_SUCCESS(err);
2123
2124 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002125 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
2127
Karl Schultz6addd812016-02-02 17:17:23 -07002128 // Introduce validation failure, try to bind a different memory object to
2129 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002130 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002132 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002133
Chia-I Wuf7458c52015-10-26 21:10:41 +08002134 vkDestroyImage(m_device->device(), image, NULL);
2135 vkFreeMemory(m_device->device(), mem1, NULL);
2136 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002138
Karl Schultz6addd812016-02-02 17:17:23 -07002139TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002140 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002141
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2143 "submitted in SIGNALED state. Fences "
2144 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002145
2146 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002147 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2148 fenceInfo.pNext = NULL;
2149 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002150
Tony Barbour1fa09702017-03-16 12:09:08 -06002151 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002152 ASSERT_NO_FATAL_FAILURE(InitViewport());
2153 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2154
Tony Barbour552f6c02016-12-21 14:34:07 -07002155 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002156 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002157 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002158
2159 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002160
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002161 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002162 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2163 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002164 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002165 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002166 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002167 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002168 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002169 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002170 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002171
2172 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002173 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002175 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002176}
Chris Forbes4e44c912016-06-16 10:20:00 +12002177
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002178TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002179 TEST_DESCRIPTION(
2180 "Specify wrong usage for image then create conflicting view of image "
2181 "Initialize buffer with wrong usage then perform copy expecting errors "
2182 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002184
Tony Barbour1fa09702017-03-16 12:09:08 -06002185 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002186 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002187 if (!format) {
2188 printf(" No Depth + Stencil format found. Skipped.\n");
2189 return;
2190 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002191
Tony Barbourf92621a2016-05-02 14:28:12 -06002192 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002193 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002194 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002195 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002196
Tony Barbourf92621a2016-05-02 14:28:12 -06002197 VkImageView dsv;
2198 VkImageViewCreateInfo dsvci = {};
2199 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2200 dsvci.image = image.handle();
2201 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002202 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 dsvci.subresourceRange.layerCount = 1;
2204 dsvci.subresourceRange.baseMipLevel = 0;
2205 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002206 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002207
Tony Barbourf92621a2016-05-02 14:28:12 -06002208 // Create a view with depth / stencil aspect for image with different usage
2209 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002211 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002212
2213 // Initialize buffer with TRANSFER_DST usage
2214 vk_testing::Buffer buffer;
2215 VkMemoryPropertyFlags reqs = 0;
2216 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2217 VkBufferImageCopy region = {};
2218 region.bufferRowLength = 128;
2219 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002220 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002221 region.imageSubresource.layerCount = 1;
2222 region.imageExtent.height = 16;
2223 region.imageExtent.width = 16;
2224 region.imageExtent.depth = 1;
2225
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002227 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002228
Chris Forbesda581202016-10-06 18:25:26 +13002229 // two separate errors from this call:
2230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002233 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2234 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002235 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002236}
Tony Barbour75d79f02016-08-30 09:39:07 -06002237
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002238TEST_F(VkLayerTest, LeakAnObject) {
2239 VkResult err;
2240
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002241 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // Note that we have to create a new device since destroying the
2244 // framework's device causes Teardown() to fail and just calling Teardown
2245 // will destroy the errorMonitor.
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
Tony Barbour1fa09702017-03-16 12:09:08 -06002249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002251 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252 std::vector<VkDeviceQueueCreateInfo> queue_info;
2253 queue_info.reserve(queue_props.size());
2254 std::vector<std::vector<float>> queue_priorities;
2255 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2256 VkDeviceQueueCreateInfo qi = {};
2257 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2258 qi.pNext = NULL;
2259 qi.queueFamilyIndex = i;
2260 qi.queueCount = queue_props[i].queueCount;
2261 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2262 qi.pQueuePriorities = queue_priorities[i].data();
2263 queue_info.push_back(qi);
2264 }
2265
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002266 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002267
2268 // The sacrificial device object
2269 VkDevice testDevice;
2270 VkDeviceCreateInfo device_create_info = {};
2271 auto features = m_device->phy().features();
2272 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2273 device_create_info.pNext = NULL;
2274 device_create_info.queueCreateInfoCount = queue_info.size();
2275 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002276 device_create_info.enabledLayerCount = 0;
2277 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 device_create_info.pEnabledFeatures = &features;
2279 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2280 ASSERT_VK_SUCCESS(err);
2281
2282 VkFence fence;
2283 VkFenceCreateInfo fence_create_info = {};
2284 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2285 fence_create_info.pNext = NULL;
2286 fence_create_info.flags = 0;
2287 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2288 ASSERT_VK_SUCCESS(err);
2289
2290 // Induce failure by not calling vkDestroyFence
2291 vkDestroyDevice(testDevice, NULL);
2292 m_errorMonitor->VerifyFound();
2293}
2294
2295TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002296 TEST_DESCRIPTION(
2297 "Allocate command buffers from one command pool and "
2298 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301
Tony Barbour1fa09702017-03-16 12:09:08 -06002302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 VkCommandPool command_pool_one;
2304 VkCommandPool command_pool_two;
2305
2306 VkCommandPoolCreateInfo pool_create_info{};
2307 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2308 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2309 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2310
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002311 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002315 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002319 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002323 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
2325 m_errorMonitor->VerifyFound();
2326
2327 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2328 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2329}
2330
2331TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2332 VkResult err;
2333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002334 TEST_DESCRIPTION(
2335 "Allocate descriptor sets from one DS pool and "
2336 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002339
Tony Barbour1fa09702017-03-16 12:09:08 -06002340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2342
2343 VkDescriptorPoolSize ds_type_count = {};
2344 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2345 ds_type_count.descriptorCount = 1;
2346
2347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2349 ds_pool_ci.pNext = NULL;
2350 ds_pool_ci.flags = 0;
2351 ds_pool_ci.maxSets = 1;
2352 ds_pool_ci.poolSizeCount = 1;
2353 ds_pool_ci.pPoolSizes = &ds_type_count;
2354
2355 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002357 ASSERT_VK_SUCCESS(err);
2358
2359 // Create a second descriptor pool
2360 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002361 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002362 ASSERT_VK_SUCCESS(err);
2363
2364 VkDescriptorSetLayoutBinding dsl_binding = {};
2365 dsl_binding.binding = 0;
2366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2367 dsl_binding.descriptorCount = 1;
2368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2369 dsl_binding.pImmutableSamplers = NULL;
2370
2371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2373 ds_layout_ci.pNext = NULL;
2374 ds_layout_ci.bindingCount = 1;
2375 ds_layout_ci.pBindings = &dsl_binding;
2376
2377 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002379 ASSERT_VK_SUCCESS(err);
2380
2381 VkDescriptorSet descriptorSet;
2382 VkDescriptorSetAllocateInfo alloc_info = {};
2383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2384 alloc_info.descriptorSetCount = 1;
2385 alloc_info.descriptorPool = ds_pool_one;
2386 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388 ASSERT_VK_SUCCESS(err);
2389
2390 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2391
2392 m_errorMonitor->VerifyFound();
2393
2394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2395 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2396 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2397}
2398
2399TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002402 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002403
Tony Barbour1fa09702017-03-16 12:09:08 -06002404 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002405
2406 // Pass bogus handle into GetImageMemoryRequirements
2407 VkMemoryRequirements mem_reqs;
2408 uint64_t fakeImageHandle = 0xCADECADE;
2409 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2410
2411 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2412
2413 m_errorMonitor->VerifyFound();
2414}
2415
Mike Schuchardt17838902017-02-21 09:48:06 -07002416TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2417 TEST_DESCRIPTION(
2418 "Try to destroy a render pass object using a device other than the one it was created on. "
2419 "This should generate a distinct error from the invalid handle error.");
2420 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002421 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2423
2424 // Create second device
2425 float priorities[] = {1.0f};
2426 VkDeviceQueueCreateInfo queue_info{};
2427 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2428 queue_info.pNext = NULL;
2429 queue_info.flags = 0;
2430 queue_info.queueFamilyIndex = 0;
2431 queue_info.queueCount = 1;
2432 queue_info.pQueuePriorities = &priorities[0];
2433
2434 VkDeviceCreateInfo device_create_info = {};
2435 auto features = m_device->phy().features();
2436 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2437 device_create_info.pNext = NULL;
2438 device_create_info.queueCreateInfoCount = 1;
2439 device_create_info.pQueueCreateInfos = &queue_info;
2440 device_create_info.enabledLayerCount = 0;
2441 device_create_info.ppEnabledLayerNames = NULL;
2442 device_create_info.pEnabledFeatures = &features;
2443
2444 VkDevice second_device;
2445 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2446
2447 // Try to destroy the renderpass from the first device using the second device
2448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2449 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2450 m_errorMonitor->VerifyFound();
2451
2452 vkDestroyDevice(second_device, NULL);
2453}
2454
Karl Schultz6addd812016-02-02 17:17:23 -07002455TEST_F(VkLayerTest, PipelineNotBound) {
2456 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002458 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002459
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002461
Tony Barbour1fa09702017-03-16 12:09:08 -06002462 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002464
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002465 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2467 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002468
2469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2471 ds_pool_ci.pNext = NULL;
2472 ds_pool_ci.maxSets = 1;
2473 ds_pool_ci.poolSizeCount = 1;
2474 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002475
2476 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002478 ASSERT_VK_SUCCESS(err);
2479
2480 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002481 dsl_binding.binding = 0;
2482 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2483 dsl_binding.descriptorCount = 1;
2484 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2485 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2489 ds_layout_ci.pNext = NULL;
2490 ds_layout_ci.bindingCount = 1;
2491 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495 ASSERT_VK_SUCCESS(err);
2496
2497 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002498 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002499 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002500 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002501 alloc_info.descriptorPool = ds_pool;
2502 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002503 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002504 ASSERT_VK_SUCCESS(err);
2505
2506 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002507 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2508 pipeline_layout_ci.pNext = NULL;
2509 pipeline_layout_ci.setLayoutCount = 1;
2510 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002511
2512 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002513 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002514 ASSERT_VK_SUCCESS(err);
2515
Mark Youngad779052016-01-06 14:26:04 -07002516 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
Tony Barbour552f6c02016-12-21 14:34:07 -07002518 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002521 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002522
Chia-I Wuf7458c52015-10-26 21:10:41 +08002523 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2525 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002526}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002527
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002528TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2529 VkResult err;
2530
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002531 TEST_DESCRIPTION(
2532 "Test validation check for an invalid memory type index "
2533 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534
Tony Barbour1fa09702017-03-16 12:09:08 -06002535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002536
2537 // Create an image, allocate memory, set a bad typeIndex and then try to
2538 // bind it
2539 VkImage image;
2540 VkDeviceMemory mem;
2541 VkMemoryRequirements mem_reqs;
2542 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2543 const int32_t tex_width = 32;
2544 const int32_t tex_height = 32;
2545
2546 VkImageCreateInfo image_create_info = {};
2547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2548 image_create_info.pNext = NULL;
2549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2550 image_create_info.format = tex_format;
2551 image_create_info.extent.width = tex_width;
2552 image_create_info.extent.height = tex_height;
2553 image_create_info.extent.depth = 1;
2554 image_create_info.mipLevels = 1;
2555 image_create_info.arrayLayers = 1;
2556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2559 image_create_info.flags = 0;
2560
2561 VkMemoryAllocateInfo mem_alloc = {};
2562 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2563 mem_alloc.pNext = NULL;
2564 mem_alloc.allocationSize = 0;
2565 mem_alloc.memoryTypeIndex = 0;
2566
2567 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2571 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002572
2573 // Introduce Failure, select invalid TypeIndex
2574 VkPhysicalDeviceMemoryProperties memory_info;
2575
2576 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2577 unsigned int i;
2578 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2579 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2580 mem_alloc.memoryTypeIndex = i;
2581 break;
2582 }
2583 }
2584 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002585 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002586 vkDestroyImage(m_device->device(), image, NULL);
2587 return;
2588 }
2589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002590 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 -06002591
2592 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2593 ASSERT_VK_SUCCESS(err);
2594
2595 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2596 (void)err;
2597
2598 m_errorMonitor->VerifyFound();
2599
2600 vkDestroyImage(m_device->device(), image, NULL);
2601 vkFreeMemory(m_device->device(), mem, NULL);
2602}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002603
Karl Schultz6addd812016-02-02 17:17:23 -07002604TEST_F(VkLayerTest, BindInvalidMemory) {
2605 VkResult err;
2606 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002607
Tony Barbour1fa09702017-03-16 12:09:08 -06002608 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002609
Cortf801b982017-01-17 18:10:21 -08002610 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002611 const int32_t tex_width = 256;
2612 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
2614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2616 image_create_info.pNext = NULL;
2617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2618 image_create_info.format = tex_format;
2619 image_create_info.extent.width = tex_width;
2620 image_create_info.extent.height = tex_height;
2621 image_create_info.extent.depth = 1;
2622 image_create_info.mipLevels = 1;
2623 image_create_info.arrayLayers = 1;
2624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2627 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002628
Cortf801b982017-01-17 18:10:21 -08002629 VkBufferCreateInfo buffer_create_info = {};
2630 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2631 buffer_create_info.pNext = NULL;
2632 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002633 buffer_create_info.size = 4 * 1024 * 1024;
2634 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002635 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Cortf801b982017-01-17 18:10:21 -08002637 // Create an image/buffer, allocate memory, free it, and then try to bind it
2638 {
2639 VkImage image = VK_NULL_HANDLE;
2640 VkBuffer buffer = VK_NULL_HANDLE;
2641 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2642 ASSERT_VK_SUCCESS(err);
2643 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2644 ASSERT_VK_SUCCESS(err);
2645 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2646 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2647 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002648
Cortf801b982017-01-17 18:10:21 -08002649 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2650 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2651 image_mem_alloc.allocationSize = image_mem_reqs.size;
2652 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2653 ASSERT_TRUE(pass);
2654 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2655 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2656 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2657 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002658
Cortf801b982017-01-17 18:10:21 -08002659 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2660 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2661 ASSERT_VK_SUCCESS(err);
2662 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2663 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 vkFreeMemory(device(), image_mem, NULL);
2666 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002667
Cortf801b982017-01-17 18:10:21 -08002668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2669 err = vkBindImageMemory(device(), image, image_mem, 0);
2670 (void)err; // This may very well return an error.
2671 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002672
Cortf801b982017-01-17 18:10:21 -08002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2674 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2675 (void)err; // This may very well return an error.
2676 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002677
Cortf801b982017-01-17 18:10:21 -08002678 vkDestroyImage(m_device->device(), image, NULL);
2679 vkDestroyBuffer(m_device->device(), buffer, NULL);
2680 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002681
2682 // Try to bind memory to an object that already has a memory binding
2683 {
2684 VkImage image = VK_NULL_HANDLE;
2685 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2686 ASSERT_VK_SUCCESS(err);
2687 VkBuffer buffer = VK_NULL_HANDLE;
2688 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2689 ASSERT_VK_SUCCESS(err);
2690 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2691 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2692 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2693 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2694 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2695 image_alloc_info.allocationSize = image_mem_reqs.size;
2696 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2697 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2698 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2699 ASSERT_TRUE(pass);
2700 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2701 ASSERT_TRUE(pass);
2702 VkDeviceMemory image_mem, buffer_mem;
2703 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2704 ASSERT_VK_SUCCESS(err);
2705 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2706 ASSERT_VK_SUCCESS(err);
2707
2708 err = vkBindImageMemory(device(), image, image_mem, 0);
2709 ASSERT_VK_SUCCESS(err);
2710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2711 err = vkBindImageMemory(device(), image, image_mem, 0);
2712 (void)err; // This may very well return an error.
2713 m_errorMonitor->VerifyFound();
2714
2715 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2716 ASSERT_VK_SUCCESS(err);
2717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2718 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2719 (void)err; // This may very well return an error.
2720 m_errorMonitor->VerifyFound();
2721
2722 vkFreeMemory(device(), image_mem, NULL);
2723 vkFreeMemory(device(), buffer_mem, NULL);
2724 vkDestroyImage(device(), image, NULL);
2725 vkDestroyBuffer(device(), buffer, NULL);
2726 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002727
Cort Strattonde748202017-02-17 12:50:01 -08002728 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002729 {
2730 VkImage image = VK_NULL_HANDLE;
2731 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2732 ASSERT_VK_SUCCESS(err);
2733 VkBuffer buffer = VK_NULL_HANDLE;
2734 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2735 ASSERT_VK_SUCCESS(err);
2736 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2737 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2738 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2739 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2740 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002741 // Leave some extra space for alignment wiggle room
2742 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002743 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002744 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002745 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2746 ASSERT_TRUE(pass);
2747 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2748 ASSERT_TRUE(pass);
2749 VkDeviceMemory image_mem, buffer_mem;
2750 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2751 ASSERT_VK_SUCCESS(err);
2752 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2753 ASSERT_VK_SUCCESS(err);
2754
Cort Strattonde748202017-02-17 12:50:01 -08002755 // Test unaligned memory offset
2756 {
2757 if (image_mem_reqs.alignment > 1) {
2758 VkDeviceSize image_offset = 1;
2759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2760 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2761 (void)err; // This may very well return an error.
2762 m_errorMonitor->VerifyFound();
2763 }
Cort6c7dff72017-01-27 18:34:50 -08002764
Cort Strattonde748202017-02-17 12:50:01 -08002765 if (buffer_mem_reqs.alignment > 1) {
2766 VkDeviceSize buffer_offset = 1;
2767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2768 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2769 (void)err; // This may very well return an error.
2770 m_errorMonitor->VerifyFound();
2771 }
2772 }
2773
2774 // Test memory offsets outside the memory allocation
2775 {
2776 VkDeviceSize image_offset =
2777 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2779 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2780 (void)err; // This may very well return an error.
2781 m_errorMonitor->VerifyFound();
2782
2783 VkDeviceSize buffer_offset =
2784 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2786 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2787 (void)err; // This may very well return an error.
2788 m_errorMonitor->VerifyFound();
2789 }
2790
2791 // Test memory offsets within the memory allocation, but which leave too little memory for
2792 // the resource.
2793 {
2794 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002795 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2797 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2798 (void)err; // This may very well return an error.
2799 m_errorMonitor->VerifyFound();
2800 }
2801
2802 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2803 if (buffer_offset > 0) {
2804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2805 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2806 (void)err; // This may very well return an error.
2807 m_errorMonitor->VerifyFound();
2808 }
2809 }
Cort6c7dff72017-01-27 18:34:50 -08002810
2811 vkFreeMemory(device(), image_mem, NULL);
2812 vkFreeMemory(device(), buffer_mem, NULL);
2813 vkDestroyImage(device(), image, NULL);
2814 vkDestroyBuffer(device(), buffer, NULL);
2815 }
2816
Cort Stratton4c38bb52017-01-28 13:33:10 -08002817 // Try to bind memory to an object with an invalid memory type
2818 {
2819 VkImage image = VK_NULL_HANDLE;
2820 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2821 ASSERT_VK_SUCCESS(err);
2822 VkBuffer buffer = VK_NULL_HANDLE;
2823 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2824 ASSERT_VK_SUCCESS(err);
2825 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2826 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2827 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2828 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2829 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2830 image_alloc_info.allocationSize = image_mem_reqs.size;
2831 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2832 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002833 // Create a mask of available memory types *not* supported by these resources,
2834 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002835 VkPhysicalDeviceMemoryProperties memory_properties = {};
2836 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002837 VkDeviceMemory image_mem, buffer_mem;
2838
Cort Stratton4c38bb52017-01-28 13:33:10 -08002839 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002840 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002841 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2842 ASSERT_TRUE(pass);
2843 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2844 ASSERT_VK_SUCCESS(err);
2845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2846 err = vkBindImageMemory(device(), image, image_mem, 0);
2847 (void)err; // This may very well return an error.
2848 m_errorMonitor->VerifyFound();
2849 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002850 }
2851
Cort Stratton4c38bb52017-01-28 13:33:10 -08002852 uint32_t buffer_unsupported_mem_type_bits =
2853 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002854 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002855 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2856 ASSERT_TRUE(pass);
2857 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2858 ASSERT_VK_SUCCESS(err);
2859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2860 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2861 (void)err; // This may very well return an error.
2862 m_errorMonitor->VerifyFound();
2863 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002864 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002865
Cort Stratton4c38bb52017-01-28 13:33:10 -08002866 vkDestroyImage(device(), image, NULL);
2867 vkDestroyBuffer(device(), buffer, NULL);
2868 }
2869
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 // Try to bind memory to an image created with sparse memory flags
2871 {
2872 VkImageCreateInfo sparse_image_create_info = image_create_info;
2873 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2874 VkImageFormatProperties image_format_properties = {};
2875 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2876 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2877 sparse_image_create_info.usage, sparse_image_create_info.flags,
2878 &image_format_properties);
2879 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2880 // most likely means sparse formats aren't supported here; skip this test.
2881 } else {
2882 ASSERT_VK_SUCCESS(err);
2883 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002884 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002885 return;
2886 } else {
2887 VkImage sparse_image = VK_NULL_HANDLE;
2888 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2889 ASSERT_VK_SUCCESS(err);
2890 VkMemoryRequirements sparse_mem_reqs = {};
2891 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2892 if (sparse_mem_reqs.memoryTypeBits != 0) {
2893 VkMemoryAllocateInfo sparse_mem_alloc = {};
2894 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2895 sparse_mem_alloc.pNext = NULL;
2896 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2897 sparse_mem_alloc.memoryTypeIndex = 0;
2898 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2899 ASSERT_TRUE(pass);
2900 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2901 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2902 ASSERT_VK_SUCCESS(err);
2903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2904 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2905 // This may very well return an error.
2906 (void)err;
2907 m_errorMonitor->VerifyFound();
2908 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2909 }
2910 vkDestroyImage(m_device->device(), sparse_image, NULL);
2911 }
2912 }
2913 }
2914
2915 // Try to bind memory to a buffer created with sparse memory flags
2916 {
2917 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2918 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2919 if (!m_device->phy().features().sparseResidencyBuffer) {
2920 // most likely means sparse formats aren't supported here; skip this test.
2921 } else {
2922 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2923 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2924 ASSERT_VK_SUCCESS(err);
2925 VkMemoryRequirements sparse_mem_reqs = {};
2926 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2927 if (sparse_mem_reqs.memoryTypeBits != 0) {
2928 VkMemoryAllocateInfo sparse_mem_alloc = {};
2929 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2930 sparse_mem_alloc.pNext = NULL;
2931 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2932 sparse_mem_alloc.memoryTypeIndex = 0;
2933 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2934 ASSERT_TRUE(pass);
2935 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2936 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2937 ASSERT_VK_SUCCESS(err);
2938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2939 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2940 // This may very well return an error.
2941 (void)err;
2942 m_errorMonitor->VerifyFound();
2943 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2944 }
2945 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2946 }
2947 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002948}
2949
Karl Schultz6addd812016-02-02 17:17:23 -07002950TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2951 VkResult err;
2952 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002953
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002955
Tony Barbour1fa09702017-03-16 12:09:08 -06002956 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Karl Schultz6addd812016-02-02 17:17:23 -07002958 // Create an image object, allocate memory, destroy the object and then try
2959 // to bind it
2960 VkImage image;
2961 VkDeviceMemory mem;
2962 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2965 const int32_t tex_width = 32;
2966 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
2968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2970 image_create_info.pNext = NULL;
2971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2972 image_create_info.format = tex_format;
2973 image_create_info.extent.width = tex_width;
2974 image_create_info.extent.height = tex_height;
2975 image_create_info.extent.depth = 1;
2976 image_create_info.mipLevels = 1;
2977 image_create_info.arrayLayers = 1;
2978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2981 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002983 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002984 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2985 mem_alloc.pNext = NULL;
2986 mem_alloc.allocationSize = 0;
2987 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wuf7458c52015-10-26 21:10:41 +08002989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002990 ASSERT_VK_SUCCESS(err);
2991
Karl Schultz6addd812016-02-02 17:17:23 -07002992 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002993
2994 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002995 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002996 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002997
2998 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003000 ASSERT_VK_SUCCESS(err);
3001
3002 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003003 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003004 ASSERT_VK_SUCCESS(err);
3005
3006 // Now Try to bind memory to this destroyed object
3007 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3008 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003009 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003010
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003011 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003012
Chia-I Wuf7458c52015-10-26 21:10:41 +08003013 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003014}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003015
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003016TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3017 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3018
Tony Barbour1fa09702017-03-16 12:09:08 -06003019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3021
3022 VkVertexInputBindingDescription input_binding;
3023 memset(&input_binding, 0, sizeof(input_binding));
3024
3025 VkVertexInputAttributeDescription input_attribs;
3026 memset(&input_attribs, 0, sizeof(input_attribs));
3027
3028 // Pick a really bad format for this purpose and make sure it should fail
3029 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3030 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3031 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003032 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003033 return;
3034 }
3035
3036 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003037 char const *vsSource =
3038 "#version 450\n"
3039 "\n"
3040 "out gl_PerVertex {\n"
3041 " vec4 gl_Position;\n"
3042 "};\n"
3043 "void main(){\n"
3044 " gl_Position = vec4(1);\n"
3045 "}\n";
3046 char const *fsSource =
3047 "#version 450\n"
3048 "\n"
3049 "layout(location=0) out vec4 color;\n"
3050 "void main(){\n"
3051 " color = vec4(1);\n"
3052 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003053
3054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3057
3058 VkPipelineObj pipe(m_device);
3059 pipe.AddColorAttachment();
3060 pipe.AddShader(&vs);
3061 pipe.AddShader(&fs);
3062
3063 pipe.AddVertexInputBindings(&input_binding, 1);
3064 pipe.AddVertexInputAttribs(&input_attribs, 1);
3065
3066 VkDescriptorSetObj descriptorSet(m_device);
3067 descriptorSet.AppendDummy();
3068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3069
3070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3071
3072 m_errorMonitor->VerifyFound();
3073}
3074
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003075TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003076 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003077 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003078
3079 VkMemoryPropertyFlags reqs = 0;
3080 VkImageCreateInfo image_create_info = {};
3081 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3082 image_create_info.pNext = NULL;
3083 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3084 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3085 image_create_info.extent.width = 256;
3086 image_create_info.extent.height = 256;
3087 image_create_info.extent.depth = 1;
3088 image_create_info.mipLevels = 1;
3089 image_create_info.arrayLayers = 1;
3090 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3091 image_create_info.flags = 0;
3092
3093 VkImageBlit blit_region = {};
3094 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3095 blit_region.srcSubresource.baseArrayLayer = 0;
3096 blit_region.srcSubresource.layerCount = 1;
3097 blit_region.srcSubresource.mipLevel = 0;
3098 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3099 blit_region.dstSubresource.baseArrayLayer = 0;
3100 blit_region.dstSubresource.layerCount = 1;
3101 blit_region.dstSubresource.mipLevel = 0;
3102
3103 // Create two images, the source with sampleCount = 2, and attempt to blit
3104 // between them
3105 {
3106 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003111 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003112 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003115 m_errorMonitor->SetDesiredFailureMsg(
3116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3117 "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 -06003118 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3119 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_errorMonitor->VerifyFound();
3121 m_commandBuffer->EndCommandBuffer();
3122 }
3123
3124 // Create two images, the dest with sampleCount = 4, and attempt to blit
3125 // between them
3126 {
3127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003128 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003129 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003130 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003131 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003136 m_errorMonitor->SetDesiredFailureMsg(
3137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3138 "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 -06003139 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3140 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_errorMonitor->VerifyFound();
3142 m_commandBuffer->EndCommandBuffer();
3143 }
3144
3145 VkBufferImageCopy copy_region = {};
3146 copy_region.bufferRowLength = 128;
3147 copy_region.bufferImageHeight = 128;
3148 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3149 copy_region.imageSubresource.layerCount = 1;
3150 copy_region.imageExtent.height = 64;
3151 copy_region.imageExtent.width = 64;
3152 copy_region.imageExtent.depth = 1;
3153
3154 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3155 // buffer to image
3156 {
3157 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003158 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3159 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003161 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003162 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003163 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003164 m_errorMonitor->SetDesiredFailureMsg(
3165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3166 "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 -06003167 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3168 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_errorMonitor->VerifyFound();
3170 m_commandBuffer->EndCommandBuffer();
3171 }
3172
3173 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3174 // image to buffer
3175 {
3176 vk_testing::Buffer dst_buffer;
3177 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3178 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003179 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003180 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003181 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003182 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003183 m_errorMonitor->SetDesiredFailureMsg(
3184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3185 "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 -06003186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003187 dst_buffer.handle(), 1, &copy_region);
3188 m_errorMonitor->VerifyFound();
3189 m_commandBuffer->EndCommandBuffer();
3190 }
3191}
3192
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003193TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003194 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003195
3196 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003197 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 -06003198 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003199 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 -06003200 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003201 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 -06003202
3203 VkImageBlit blitRegion = {};
3204 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3205 blitRegion.srcSubresource.baseArrayLayer = 0;
3206 blitRegion.srcSubresource.layerCount = 1;
3207 blitRegion.srcSubresource.mipLevel = 0;
3208 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3209 blitRegion.dstSubresource.baseArrayLayer = 0;
3210 blitRegion.dstSubresource.layerCount = 1;
3211 blitRegion.dstSubresource.mipLevel = 0;
3212
Dave Houlton34df4cb2016-12-01 16:43:06 -07003213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3214
3215 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3216 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
3218 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003219 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003220 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003221 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003222
3223 m_errorMonitor->VerifyFound();
3224
Dave Houlton34df4cb2016-12-01 16:43:06 -07003225 // Test should generate 2 VU failures
3226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003230 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003231 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003232
Dave Houlton34df4cb2016-12-01 16:43:06 -07003233 // TODO: Note that this only verifies that at least one of the VU enums was found
3234 // 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 -06003235 m_errorMonitor->VerifyFound();
3236
Tony Barbour552f6c02016-12-21 14:34:07 -07003237 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238}
3239
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003240TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3241 VkResult err;
3242 bool pass;
3243
3244 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003245 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246
3247 // If w/d/h granularity is 1, test is not meaningful
3248 // TODO: When virtual device limits are available, create a set of limits for this test that
3249 // will always have a granularity of > 1 for w, h, and d
3250 auto index = m_device->graphics_queue_node_index_;
3251 auto queue_family_properties = m_device->phy().queue_properties();
3252
3253 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3254 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3255 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3256 return;
3257 }
3258
3259 // Create two images of different types and try to copy between them
3260 VkImage srcImage;
3261 VkImage dstImage;
3262 VkDeviceMemory srcMem;
3263 VkDeviceMemory destMem;
3264 VkMemoryRequirements memReqs;
3265
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003266 VkImageCreateInfo image_create_info = {};
3267 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3268 image_create_info.pNext = NULL;
3269 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3270 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3271 image_create_info.extent.width = 32;
3272 image_create_info.extent.height = 32;
3273 image_create_info.extent.depth = 1;
3274 image_create_info.mipLevels = 1;
3275 image_create_info.arrayLayers = 4;
3276 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3277 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3278 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3279 image_create_info.flags = 0;
3280
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_VK_SUCCESS(err);
3283
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003284 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003285 ASSERT_VK_SUCCESS(err);
3286
3287 // Allocate memory
3288 VkMemoryAllocateInfo memAlloc = {};
3289 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3290 memAlloc.pNext = NULL;
3291 memAlloc.allocationSize = 0;
3292 memAlloc.memoryTypeIndex = 0;
3293
3294 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3295 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003296 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003297 ASSERT_TRUE(pass);
3298 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3299 ASSERT_VK_SUCCESS(err);
3300
3301 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3302 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003303 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003304 ASSERT_VK_SUCCESS(err);
3305 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3306 ASSERT_VK_SUCCESS(err);
3307
3308 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3309 ASSERT_VK_SUCCESS(err);
3310 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3311 ASSERT_VK_SUCCESS(err);
3312
Tony Barbour552f6c02016-12-21 14:34:07 -07003313 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003314 VkImageCopy copyRegion;
3315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3316 copyRegion.srcSubresource.mipLevel = 0;
3317 copyRegion.srcSubresource.baseArrayLayer = 0;
3318 copyRegion.srcSubresource.layerCount = 1;
3319 copyRegion.srcOffset.x = 0;
3320 copyRegion.srcOffset.y = 0;
3321 copyRegion.srcOffset.z = 0;
3322 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3323 copyRegion.dstSubresource.mipLevel = 0;
3324 copyRegion.dstSubresource.baseArrayLayer = 0;
3325 copyRegion.dstSubresource.layerCount = 1;
3326 copyRegion.dstOffset.x = 0;
3327 copyRegion.dstOffset.y = 0;
3328 copyRegion.dstOffset.z = 0;
3329 copyRegion.extent.width = 1;
3330 copyRegion.extent.height = 1;
3331 copyRegion.extent.depth = 1;
3332
3333 // Introduce failure by setting srcOffset to a bad granularity value
3334 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3336 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003337 m_errorMonitor->VerifyFound();
3338
3339 // Introduce failure by setting extent to a bad granularity value
3340 copyRegion.srcOffset.y = 0;
3341 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3343 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003344 m_errorMonitor->VerifyFound();
3345
3346 // Now do some buffer/image copies
3347 vk_testing::Buffer buffer;
3348 VkMemoryPropertyFlags reqs = 0;
3349 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3350 VkBufferImageCopy region = {};
3351 region.bufferOffset = 0;
3352 region.bufferRowLength = 3;
3353 region.bufferImageHeight = 128;
3354 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3355 region.imageSubresource.layerCount = 1;
3356 region.imageExtent.height = 16;
3357 region.imageExtent.width = 16;
3358 region.imageExtent.depth = 1;
3359 region.imageOffset.x = 0;
3360 region.imageOffset.y = 0;
3361 region.imageOffset.z = 0;
3362
3363 // Introduce failure by setting bufferRowLength to a bad granularity value
3364 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3366 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3367 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003368 m_errorMonitor->VerifyFound();
3369 region.bufferRowLength = 128;
3370
3371 // Introduce failure by setting bufferOffset to a bad granularity value
3372 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3375 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003376 m_errorMonitor->VerifyFound();
3377 region.bufferOffset = 0;
3378
3379 // Introduce failure by setting bufferImageHeight to a bad granularity value
3380 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3383 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003384 m_errorMonitor->VerifyFound();
3385 region.bufferImageHeight = 128;
3386
3387 // Introduce failure by setting imageExtent to a bad granularity value
3388 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3391 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003392 m_errorMonitor->VerifyFound();
3393 region.imageExtent.width = 16;
3394
3395 // Introduce failure by setting imageOffset to a bad granularity value
3396 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3398 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3399 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003400 m_errorMonitor->VerifyFound();
3401
Tony Barbour552f6c02016-12-21 14:34:07 -07003402 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003403
3404 vkDestroyImage(m_device->device(), srcImage, NULL);
3405 vkDestroyImage(m_device->device(), dstImage, NULL);
3406 vkFreeMemory(m_device->device(), srcMem, NULL);
3407 vkFreeMemory(m_device->device(), destMem, NULL);
3408}
3409
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003410TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003411 TEST_DESCRIPTION(
3412 "Submit command buffer created using one queue family and "
3413 "attempt to submit them on a queue created in a different "
3414 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003415
Tony Barbour1fa09702017-03-16 12:09:08 -06003416 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003417
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418 // This test is meaningless unless we have multiple queue families
3419 auto queue_family_properties = m_device->phy().queue_properties();
3420 if (queue_family_properties.size() < 2) {
3421 return;
3422 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // Get safe index of another queue family
3425 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003426 VkQueue other_queue;
3427 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3428
3429 // Record an empty cmd buffer
3430 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3431 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3432 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3433 vkEndCommandBuffer(m_commandBuffer->handle());
3434
3435 // And submit on the wrong queue
3436 VkSubmitInfo submit_info = {};
3437 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3438 submit_info.commandBufferCount = 1;
3439 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003440 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003441
3442 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003443}
3444
Chris Forbes4c24a922016-11-16 08:59:10 +13003445TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003446 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003447
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003448 // There are no attachments, but refer to attachment 0.
3449 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003450 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003452 };
3453
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003454 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003455 VkRenderPass rp;
3456
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003457 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003459 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3460 m_errorMonitor->VerifyFound();
3461}
3462
Chris Forbesa58c4522016-09-28 15:19:39 +13003463TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3464 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003465 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003466
3467 // A renderpass with two subpasses, both writing the same attachment.
3468 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3470 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3471 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003472 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003473 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003474 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3476 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003477 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 VkSubpassDependency dep = {0,
3479 1,
3480 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3481 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3482 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3483 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3484 VK_DEPENDENCY_BY_REGION_BIT};
3485 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003486 VkRenderPass rp;
3487 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3488 ASSERT_VK_SUCCESS(err);
3489
3490 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003491 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 +13003492 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003494 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003495 VkFramebuffer fb;
3496 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3497 ASSERT_VK_SUCCESS(err);
3498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003499 char const *vsSource =
3500 "#version 450\n"
3501 "void main() { gl_Position = vec4(1); }\n";
3502 char const *fsSource =
3503 "#version 450\n"
3504 "layout(location=0) out vec4 color;\n"
3505 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003506
3507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3509 VkPipelineObj pipe(m_device);
3510 pipe.AddColorAttachment();
3511 pipe.AddShader(&vs);
3512 pipe.AddShader(&fs);
3513 VkViewport view_port = {};
3514 m_viewports.push_back(view_port);
3515 pipe.SetViewport(m_viewports);
3516 VkRect2D rect = {};
3517 m_scissors.push_back(rect);
3518 pipe.SetScissor(m_scissors);
3519
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003520 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003521 VkPipelineLayout pl;
3522 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3523 ASSERT_VK_SUCCESS(err);
3524 pipe.CreateVKPipeline(pl, rp);
3525
Tony Barbour552f6c02016-12-21 14:34:07 -07003526 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003527
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3529 nullptr,
3530 rp,
3531 fb,
3532 {{
3533 0, 0,
3534 },
3535 {32, 32}},
3536 0,
3537 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003538
3539 // subtest 1: bind in the wrong subpass
3540 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3541 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003542 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 +13003543 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3544 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3545 m_errorMonitor->VerifyFound();
3546
3547 vkCmdEndRenderPass(m_commandBuffer->handle());
3548
3549 // subtest 2: bind in correct subpass, then transition to next subpass
3550 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3551 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3552 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003553 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 +13003554 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3555 m_errorMonitor->VerifyFound();
3556
3557 vkCmdEndRenderPass(m_commandBuffer->handle());
3558
Tony Barbour552f6c02016-12-21 14:34:07 -07003559 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003560
3561 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3562 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3563 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3564}
3565
Tony Barbour4e919972016-08-09 13:27:40 -06003566TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003567 TEST_DESCRIPTION(
3568 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3569 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003570 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3572
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3574 "Cannot execute a render pass with renderArea "
3575 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003576
3577 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3578 m_renderPassBeginInfo.renderArea.extent.width = 257;
3579 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003580 m_commandBuffer->BeginCommandBuffer();
3581 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003582 m_errorMonitor->VerifyFound();
3583}
3584
3585TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003586 TEST_DESCRIPTION(
3587 "Generate INDEPENDENT_BLEND by disabling independent "
3588 "blend and then specifying different blend states for two "
3589 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003590 VkPhysicalDeviceFeatures features = {};
3591 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003592 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003593
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3595 "Invalid Pipeline CreateInfo: If independent blend feature not "
3596 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003597
Cody Northropc31a84f2016-08-22 10:41:47 -06003598 VkDescriptorSetObj descriptorSet(m_device);
3599 descriptorSet.AppendDummy();
3600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003601
Cody Northropc31a84f2016-08-22 10:41:47 -06003602 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003603 // Create a renderPass with two color attachments
3604 VkAttachmentReference attachments[2] = {};
3605 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003606 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003607 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3608
3609 VkSubpassDescription subpass = {};
3610 subpass.pColorAttachments = attachments;
3611 subpass.colorAttachmentCount = 2;
3612
3613 VkRenderPassCreateInfo rpci = {};
3614 rpci.subpassCount = 1;
3615 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003616 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003617
Tony Barbourffd60bd2017-03-09 12:04:55 -07003618 VkAttachmentDescription attach_desc[2] = {};
3619 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3620 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3621 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3622 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3623 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3624 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3625 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3626 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003627
Tony Barbourffd60bd2017-03-09 12:04:55 -07003628 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003629 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3630
3631 VkRenderPass renderpass;
3632 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003633 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003634 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003635
Cody Northropc31a84f2016-08-22 10:41:47 -06003636 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3640 att_state2.blendEnable = VK_FALSE;
3641 pipeline.AddColorAttachment(0, &att_state1);
3642 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003643 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003644 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003645 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003646}
3647
Mike Weiblen40b160e2017-02-06 19:21:52 -07003648// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3649TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3650 TEST_DESCRIPTION(
3651 "Create a graphics pipeline that is incompatible with the requirements "
3652 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003653 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654
3655 VkDescriptorSetObj ds_obj(m_device);
3656 ds_obj.AppendDummy();
3657 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3658
3659 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3660
3661 VkPipelineColorBlendAttachmentState att_state1 = {};
3662 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3663 att_state1.blendEnable = VK_TRUE;
3664
3665 VkRenderpassObj rp_obj(m_device);
3666
3667 {
3668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3669 VkPipelineObj pipeline(m_device);
3670 pipeline.AddShader(&vs_obj);
3671 pipeline.AddColorAttachment(0, &att_state1);
3672
3673 VkGraphicsPipelineCreateInfo info = {};
3674 pipeline.InitGraphicsPipelineCreateInfo(&info);
3675 info.pColorBlendState = nullptr;
3676
3677 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3678 m_errorMonitor->VerifyFound();
3679 }
3680}
3681
Chris Forbes26ec2122016-11-29 08:58:33 +13003682#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003683TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3684 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3685 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003686 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003687
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3689 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003690
3691 // Create a renderPass with a single color attachment
3692 VkAttachmentReference attach = {};
3693 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3694 VkSubpassDescription subpass = {};
3695 VkRenderPassCreateInfo rpci = {};
3696 rpci.subpassCount = 1;
3697 rpci.pSubpasses = &subpass;
3698 rpci.attachmentCount = 1;
3699 VkAttachmentDescription attach_desc = {};
3700 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3701 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3702 rpci.pAttachments = &attach_desc;
3703 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3704 VkRenderPass rp;
3705 subpass.pDepthStencilAttachment = &attach;
3706 subpass.pColorAttachments = NULL;
3707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3708 m_errorMonitor->VerifyFound();
3709}
Chris Forbes26ec2122016-11-29 08:58:33 +13003710#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003711
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003712TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003713 TEST_DESCRIPTION(
3714 "Create a framebuffer where a subpass has a preserve "
3715 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003716
Tony Barbour1fa09702017-03-16 12:09:08 -06003717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3719
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003721
3722 VkAttachmentReference color_attach = {};
3723 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3724 color_attach.attachment = 0;
3725 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3726 VkSubpassDescription subpass = {};
3727 subpass.colorAttachmentCount = 1;
3728 subpass.pColorAttachments = &color_attach;
3729 subpass.preserveAttachmentCount = 1;
3730 subpass.pPreserveAttachments = &preserve_attachment;
3731
3732 VkRenderPassCreateInfo rpci = {};
3733 rpci.subpassCount = 1;
3734 rpci.pSubpasses = &subpass;
3735 rpci.attachmentCount = 1;
3736 VkAttachmentDescription attach_desc = {};
3737 attach_desc.format = VK_FORMAT_UNDEFINED;
3738 rpci.pAttachments = &attach_desc;
3739 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3740 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003741 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003742
3743 m_errorMonitor->VerifyFound();
3744
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003745 if (result == VK_SUCCESS) {
3746 vkDestroyRenderPass(m_device->device(), rp, NULL);
3747 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748}
3749
Chris Forbesc5389742016-06-29 11:49:23 +12003750TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 TEST_DESCRIPTION(
3752 "Ensure that CreateRenderPass produces a validation error "
3753 "when the source of a subpass multisample resolve "
3754 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003755
Tony Barbour1fa09702017-03-16 12:09:08 -06003756 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003757
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3759 "Subpass 0 requests multisample resolve from attachment 0 which has "
3760 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003761
3762 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003763 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3765 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3766 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3767 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3768 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003769 };
3770
3771 VkAttachmentReference color = {
3772 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3773 };
3774
3775 VkAttachmentReference resolve = {
3776 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3777 };
3778
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003779 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003781 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003782
3783 VkRenderPass rp;
3784 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3785
3786 m_errorMonitor->VerifyFound();
3787
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003789}
3790
3791TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003792 TEST_DESCRIPTION(
3793 "Ensure CreateRenderPass produces a validation error "
3794 "when a subpass multisample resolve operation is "
3795 "requested, and the destination of that resolve has "
3796 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003797
Tony Barbour1fa09702017-03-16 12:09:08 -06003798 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003799
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3801 "Subpass 0 requests multisample resolve into attachment 1, which "
3802 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003803
3804 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3806 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3807 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3808 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3809 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3810 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003811 };
3812
3813 VkAttachmentReference color = {
3814 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3815 };
3816
3817 VkAttachmentReference resolve = {
3818 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3819 };
3820
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003821 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003823 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003824
3825 VkRenderPass rp;
3826 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3827
3828 m_errorMonitor->VerifyFound();
3829
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003830 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003831}
3832
Chris Forbes3f128ef2016-06-29 14:58:53 +12003833TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003834 TEST_DESCRIPTION(
3835 "Ensure CreateRenderPass produces a validation error "
3836 "when the color and depth attachments used by a subpass "
3837 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003838
Tony Barbour1fa09702017-03-16 12:09:08 -06003839 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003840
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3842 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003843
3844 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003845 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3846 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3847 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3848 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3849 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3850 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003851 };
3852
3853 VkAttachmentReference color[] = {
3854 {
3855 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 },
3857 {
3858 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3859 },
3860 };
3861
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003862 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003864 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003865
3866 VkRenderPass rp;
3867 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3868
3869 m_errorMonitor->VerifyFound();
3870
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003871 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003872}
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003875 TEST_DESCRIPTION(
3876 "Hit errors when attempting to create a framebuffer :\n"
3877 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3878 " 2. Use a color image as depthStencil attachment\n"
3879 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3880 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3881 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3882 " 6. Framebuffer attachment where dimensions don't match\n"
3883 " 7. Framebuffer attachment w/o identity swizzle\n"
3884 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885
Tony Barbour1fa09702017-03-16 12:09:08 -06003886 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3888
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003889 m_errorMonitor->SetDesiredFailureMsg(
3890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3891 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003893 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 VkAttachmentReference attach = {};
3895 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3896 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003897 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898 VkRenderPassCreateInfo rpci = {};
3899 rpci.subpassCount = 1;
3900 rpci.pSubpasses = &subpass;
3901 rpci.attachmentCount = 1;
3902 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003903 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003904 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003905 rpci.pAttachments = &attach_desc;
3906 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3907 VkRenderPass rp;
3908 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3909 ASSERT_VK_SUCCESS(err);
3910
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003911 VkImageView ivs[2];
3912 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3913 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003914 VkFramebufferCreateInfo fb_info = {};
3915 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3916 fb_info.pNext = NULL;
3917 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003918 // Set mis-matching attachmentCount
3919 fb_info.attachmentCount = 2;
3920 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003921 fb_info.width = 100;
3922 fb_info.height = 100;
3923 fb_info.layers = 1;
3924
3925 VkFramebuffer fb;
3926 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3927
3928 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003929 if (err == VK_SUCCESS) {
3930 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3931 }
3932 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003933
3934 // Create a renderPass with a depth-stencil attachment created with
3935 // IMAGE_USAGE_COLOR_ATTACHMENT
3936 // Add our color attachment to pDepthStencilAttachment
3937 subpass.pDepthStencilAttachment = &attach;
3938 subpass.pColorAttachments = NULL;
3939 VkRenderPass rp_ds;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3941 ASSERT_VK_SUCCESS(err);
3942 // Set correct attachment count, but attachment has COLOR usage bit set
3943 fb_info.attachmentCount = 1;
3944 fb_info.renderPass = rp_ds;
3945
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003947 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3948
3949 m_errorMonitor->VerifyFound();
3950 if (err == VK_SUCCESS) {
3951 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3952 }
3953 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954
3955 // Create new renderpass with alternate attachment format from fb
3956 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3957 subpass.pDepthStencilAttachment = NULL;
3958 subpass.pColorAttachments = &attach;
3959 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3960 ASSERT_VK_SUCCESS(err);
3961
3962 // Cause error due to mis-matched formats between rp & fb
3963 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3964 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3966 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003967 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3968
3969 m_errorMonitor->VerifyFound();
3970 if (err == VK_SUCCESS) {
3971 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3972 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003973 vkDestroyRenderPass(m_device->device(), rp, NULL);
3974
3975 // Create new renderpass with alternate sample count from fb
3976 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3977 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
3980
3981 // Cause error due to mis-matched sample count between rp & fb
3982 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003984 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003985 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3986
3987 m_errorMonitor->VerifyFound();
3988 if (err == VK_SUCCESS) {
3989 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3990 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003991
3992 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003993
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003994 {
3995 // Create an image with 2 mip levels.
3996 VkImageObj image(m_device);
3997 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3998 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003999
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004000 // Create a image view with two mip levels.
4001 VkImageView view;
4002 VkImageViewCreateInfo ivci = {};
4003 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4004 ivci.image = image.handle();
4005 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4006 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4007 ivci.subresourceRange.layerCount = 1;
4008 ivci.subresourceRange.baseMipLevel = 0;
4009 // Set level count to 2 (only 1 is allowed for FB attachment)
4010 ivci.subresourceRange.levelCount = 2;
4011 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4012 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4013 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004014
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004015 // Re-create renderpass to have matching sample count
4016 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4017 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4018 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004019
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004020 fb_info.renderPass = rp;
4021 fb_info.pAttachments = &view;
4022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
4023 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4024
4025 m_errorMonitor->VerifyFound();
4026 if (err == VK_SUCCESS) {
4027 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4028 }
4029 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004030 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004031
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004032 // Update view to original color buffer and grow FB dimensions too big
4033 fb_info.pAttachments = ivs;
4034 fb_info.height = 1024;
4035 fb_info.width = 1024;
4036 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004038 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4039
4040 m_errorMonitor->VerifyFound();
4041 if (err == VK_SUCCESS) {
4042 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4043 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004044
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004045 {
4046 // Create an image with one mip level.
4047 VkImageObj image(m_device);
4048 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4049 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004051 // Create view attachment with non-identity swizzle
4052 VkImageView view;
4053 VkImageViewCreateInfo ivci = {};
4054 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4055 ivci.image = image.handle();
4056 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4057 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4058 ivci.subresourceRange.layerCount = 1;
4059 ivci.subresourceRange.baseMipLevel = 0;
4060 ivci.subresourceRange.levelCount = 1;
4061 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4062 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4063 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4064 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4065 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4066 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4067 ASSERT_VK_SUCCESS(err);
4068
4069 fb_info.pAttachments = &view;
4070 fb_info.height = 100;
4071 fb_info.width = 100;
4072 fb_info.layers = 1;
4073
4074 m_errorMonitor->SetDesiredFailureMsg(
4075 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4076 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
4077 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4078
4079 m_errorMonitor->VerifyFound();
4080 if (err == VK_SUCCESS) {
4081 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4082 }
4083 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004084 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004085
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004086 // reset attachment to color attachment
4087 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004088
4089 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004090 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004091 fb_info.height = 100;
4092 fb_info.layers = 1;
4093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004094 m_errorMonitor->SetDesiredFailureMsg(
4095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004096 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4097 "Here are the respective dimensions for attachment");
4098
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004099 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4100
4101 m_errorMonitor->VerifyFound();
4102 if (err == VK_SUCCESS) {
4103 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4104 }
4105
4106 // Request fb that exceeds max height
4107 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004108 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004109 fb_info.layers = 1;
4110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004111 m_errorMonitor->SetDesiredFailureMsg(
4112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004113 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4114 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004115 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4116
4117 m_errorMonitor->VerifyFound();
4118 if (err == VK_SUCCESS) {
4119 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4120 }
4121
4122 // Request fb that exceeds max layers
4123 fb_info.width = 100;
4124 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004125 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004127 m_errorMonitor->SetDesiredFailureMsg(
4128 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004129 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4130 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004131 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4132
4133 m_errorMonitor->VerifyFound();
4134 if (err == VK_SUCCESS) {
4135 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4136 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004137
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004138 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004139}
4140
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004141TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004142 TEST_DESCRIPTION(
4143 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4144 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004145
Tony Barbour1fa09702017-03-16 12:09:08 -06004146 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4149 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004150 m_errorMonitor->VerifyFound();
4151}
4152
4153TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004154 TEST_DESCRIPTION(
4155 "Run a simple draw calls to validate failure when Line Width dynamic "
4156 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004157
Tony Barbour1fa09702017-03-16 12:09:08 -06004158 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004159 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004162 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004163}
4164
4165TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Viewport dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4173 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004174 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004175 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004176}
4177
4178TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004179 TEST_DESCRIPTION(
4180 "Run a simple draw calls to validate failure when Scissor dynamic "
4181 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004182
Tony Barbour1fa09702017-03-16 12:09:08 -06004183 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004184 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
Cortd713fe82016-07-27 09:51:27 -07004191TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Blend Constants "
4194 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004197 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic blend constants state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004201 m_errorMonitor->VerifyFound();
4202}
4203
4204TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4207 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004210 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004211 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004212 return;
4213 }
4214 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4216 "Dynamic depth bounds state not set for this command buffer");
4217 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004218 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004219}
4220
4221TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004222 TEST_DESCRIPTION(
4223 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4224 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004225
Tony Barbour1fa09702017-03-16 12:09:08 -06004226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004227 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4229 "Dynamic stencil read mask state not set for this command buffer");
4230 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004231 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004232}
4233
4234TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004235 TEST_DESCRIPTION(
4236 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4237 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004238
Tony Barbour1fa09702017-03-16 12:09:08 -06004239 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004240 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "Dynamic stencil write mask state not set for this command buffer");
4243 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004244 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004245}
4246
4247TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004248 TEST_DESCRIPTION(
4249 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4250 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004251
Tony Barbour1fa09702017-03-16 12:09:08 -06004252 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004253 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4255 "Dynamic stencil reference state not set for this command buffer");
4256 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004257 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004258}
4259
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004260TEST_F(VkLayerTest, IndexBufferNotBound) {
4261 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004262
Tony Barbour1fa09702017-03-16 12:09:08 -06004263 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4265 "Index buffer object not bound to this command buffer when Indexed ");
4266 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004267 m_errorMonitor->VerifyFound();
4268}
4269
Karl Schultz6addd812016-02-02 17:17:23 -07004270TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4272 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4273 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004274
Tony Barbour1fa09702017-03-16 12:09:08 -06004275 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276 ASSERT_NO_FATAL_FAILURE(InitViewport());
4277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4278
Karl Schultz6addd812016-02-02 17:17:23 -07004279 // We luck out b/c by default the framework creates CB w/ the
4280 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004281 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004282 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004283 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004284
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004285 // Bypass framework since it does the waits automatically
4286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004296 submit_info.pSignalSemaphores = NULL;
4297
Chris Forbes40028e22016-06-13 09:59:34 +12004298 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004299 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004300 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004301
Karl Schultz6addd812016-02-02 17:17:23 -07004302 // Cause validation error by re-submitting cmd buffer that should only be
4303 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004304 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004305 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004306
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004307 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004308}
4309
Karl Schultz6addd812016-02-02 17:17:23 -07004310TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004311 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004312 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004313
Tony Barbour1fa09702017-03-16 12:09:08 -06004314 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004316
Karl Schultz6addd812016-02-02 17:17:23 -07004317 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4318 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004319 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004320 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004321 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004322
4323 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004324 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4325 ds_pool_ci.pNext = NULL;
4326 ds_pool_ci.flags = 0;
4327 ds_pool_ci.maxSets = 1;
4328 ds_pool_ci.poolSizeCount = 1;
4329 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004330
4331 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004332 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004333 ASSERT_VK_SUCCESS(err);
4334
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004335 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4336 dsl_binding_samp.binding = 0;
4337 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4338 dsl_binding_samp.descriptorCount = 1;
4339 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4340 dsl_binding_samp.pImmutableSamplers = NULL;
4341
4342 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4343 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4344 ds_layout_ci.pNext = NULL;
4345 ds_layout_ci.bindingCount = 1;
4346 ds_layout_ci.pBindings = &dsl_binding_samp;
4347
4348 VkDescriptorSetLayout ds_layout_samp;
4349 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4350 ASSERT_VK_SUCCESS(err);
4351
4352 // Try to allocate 2 sets when pool only has 1 set
4353 VkDescriptorSet descriptor_sets[2];
4354 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4355 VkDescriptorSetAllocateInfo alloc_info = {};
4356 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4357 alloc_info.descriptorSetCount = 2;
4358 alloc_info.descriptorPool = ds_pool;
4359 alloc_info.pSetLayouts = set_layouts;
4360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4362 m_errorMonitor->VerifyFound();
4363
4364 alloc_info.descriptorSetCount = 1;
4365 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004366 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004367 dsl_binding.binding = 0;
4368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4369 dsl_binding.descriptorCount = 1;
4370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4371 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372
Karl Schultz6addd812016-02-02 17:17:23 -07004373 ds_layout_ci.bindingCount = 1;
4374 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004375
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004376 VkDescriptorSetLayout ds_layout_ub;
4377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378 ASSERT_VK_SUCCESS(err);
4379
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004380 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004381 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004382 alloc_info.pSetLayouts = &ds_layout_ub;
4383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4384 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004385
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004386 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387
Karl Schultz2825ab92016-12-02 08:23:14 -07004388 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004389 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004390 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004391}
4392
Karl Schultz6addd812016-02-02 17:17:23 -07004393TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4394 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004397
Tony Barbour1fa09702017-03-16 12:09:08 -06004398 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004400
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004401 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004402 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4403 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004404
4405 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004406 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4407 ds_pool_ci.pNext = NULL;
4408 ds_pool_ci.maxSets = 1;
4409 ds_pool_ci.poolSizeCount = 1;
4410 ds_pool_ci.flags = 0;
4411 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4412 // app can only call vkResetDescriptorPool on this pool.;
4413 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004414
4415 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004417 ASSERT_VK_SUCCESS(err);
4418
4419 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004420 dsl_binding.binding = 0;
4421 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4422 dsl_binding.descriptorCount = 1;
4423 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4424 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004425
4426 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004427 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4428 ds_layout_ci.pNext = NULL;
4429 ds_layout_ci.bindingCount = 1;
4430 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004431
4432 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004434 ASSERT_VK_SUCCESS(err);
4435
4436 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004437 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004439 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004440 alloc_info.descriptorPool = ds_pool;
4441 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004443 ASSERT_VK_SUCCESS(err);
4444
4445 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004446 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004447
Chia-I Wuf7458c52015-10-26 21:10:41 +08004448 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4449 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004450}
4451
Karl Schultz6addd812016-02-02 17:17:23 -07004452TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004453 // Attempt to clear Descriptor Pool with bad object.
4454 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004455
Tony Barbour1fa09702017-03-16 12:09:08 -06004456 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004458 uint64_t fake_pool_handle = 0xbaad6001;
4459 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4460 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004461 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004462}
4463
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004464TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004465 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4466 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004467 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004468 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004469
4470 uint64_t fake_set_handle = 0xbaad6001;
4471 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004472 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004474
Tony Barbour1fa09702017-03-16 12:09:08 -06004475 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004476
4477 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4478 layout_bindings[0].binding = 0;
4479 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4480 layout_bindings[0].descriptorCount = 1;
4481 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4482 layout_bindings[0].pImmutableSamplers = NULL;
4483
4484 VkDescriptorSetLayout descriptor_set_layout;
4485 VkDescriptorSetLayoutCreateInfo dslci = {};
4486 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4487 dslci.pNext = NULL;
4488 dslci.bindingCount = 1;
4489 dslci.pBindings = layout_bindings;
4490 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004491 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004492
4493 VkPipelineLayout pipeline_layout;
4494 VkPipelineLayoutCreateInfo plci = {};
4495 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4496 plci.pNext = NULL;
4497 plci.setLayoutCount = 1;
4498 plci.pSetLayouts = &descriptor_set_layout;
4499 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004500 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004501
Tony Barbour552f6c02016-12-21 14:34:07 -07004502 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4504 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004505 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004506 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004507 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4508 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004509}
4510
Karl Schultz6addd812016-02-02 17:17:23 -07004511TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004512 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4513 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004514 uint64_t fake_layout_handle = 0xbaad6001;
4515 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004517 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004518 VkPipelineLayout pipeline_layout;
4519 VkPipelineLayoutCreateInfo plci = {};
4520 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4521 plci.pNext = NULL;
4522 plci.setLayoutCount = 1;
4523 plci.pSetLayouts = &bad_layout;
4524 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4525
4526 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004527}
4528
Mark Muellerd4914412016-06-13 17:52:06 -06004529TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004530 TEST_DESCRIPTION(
4531 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4532 "1) A uniform buffer update must have a valid buffer index."
4533 "2) When using an array of descriptors in a single WriteDescriptor,"
4534 " the descriptor types and stageflags must all be the same."
4535 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004536
Mike Weiblena6666382017-01-05 15:16:11 -07004537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004538
Tony Barbour1fa09702017-03-16 12:09:08 -06004539 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004540 VkDescriptorPoolSize ds_type_count[4] = {};
4541 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4542 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004543 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004544 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004545 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004546 ds_type_count[2].descriptorCount = 1;
4547 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4548 ds_type_count[3].descriptorCount = 1;
4549
4550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4552 ds_pool_ci.maxSets = 1;
4553 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4554 ds_pool_ci.pPoolSizes = ds_type_count;
4555
4556 VkDescriptorPool ds_pool;
4557 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4558 ASSERT_VK_SUCCESS(err);
4559
Mark Muellerb9896722016-06-16 09:54:29 -06004560 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004561 layout_binding[0].binding = 0;
4562 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4563 layout_binding[0].descriptorCount = 1;
4564 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4565 layout_binding[0].pImmutableSamplers = NULL;
4566
4567 layout_binding[1].binding = 1;
4568 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4569 layout_binding[1].descriptorCount = 1;
4570 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4571 layout_binding[1].pImmutableSamplers = NULL;
4572
4573 VkSamplerCreateInfo sampler_ci = {};
4574 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4575 sampler_ci.pNext = NULL;
4576 sampler_ci.magFilter = VK_FILTER_NEAREST;
4577 sampler_ci.minFilter = VK_FILTER_NEAREST;
4578 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4579 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4580 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4581 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4582 sampler_ci.mipLodBias = 1.0;
4583 sampler_ci.anisotropyEnable = VK_FALSE;
4584 sampler_ci.maxAnisotropy = 1;
4585 sampler_ci.compareEnable = VK_FALSE;
4586 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4587 sampler_ci.minLod = 1.0;
4588 sampler_ci.maxLod = 1.0;
4589 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4590 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4591 VkSampler sampler;
4592
4593 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4594 ASSERT_VK_SUCCESS(err);
4595
4596 layout_binding[2].binding = 2;
4597 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4598 layout_binding[2].descriptorCount = 1;
4599 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4600 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4601
Mark Muellerd4914412016-06-13 17:52:06 -06004602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4604 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4605 ds_layout_ci.pBindings = layout_binding;
4606 VkDescriptorSetLayout ds_layout;
4607 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4608 ASSERT_VK_SUCCESS(err);
4609
4610 VkDescriptorSetAllocateInfo alloc_info = {};
4611 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4612 alloc_info.descriptorSetCount = 1;
4613 alloc_info.descriptorPool = ds_pool;
4614 alloc_info.pSetLayouts = &ds_layout;
4615 VkDescriptorSet descriptorSet;
4616 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4617 ASSERT_VK_SUCCESS(err);
4618
4619 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4620 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4621 pipeline_layout_ci.pNext = NULL;
4622 pipeline_layout_ci.setLayoutCount = 1;
4623 pipeline_layout_ci.pSetLayouts = &ds_layout;
4624
4625 VkPipelineLayout pipeline_layout;
4626 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4627 ASSERT_VK_SUCCESS(err);
4628
Mark Mueller5c838ce2016-06-16 09:54:29 -06004629 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004630 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4631 descriptor_write.dstSet = descriptorSet;
4632 descriptor_write.dstBinding = 0;
4633 descriptor_write.descriptorCount = 1;
4634 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4635
Mark Mueller5c838ce2016-06-16 09:54:29 -06004636 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004637 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4638 m_errorMonitor->VerifyFound();
4639
4640 // Create a buffer to update the descriptor with
4641 uint32_t qfi = 0;
4642 VkBufferCreateInfo buffCI = {};
4643 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4644 buffCI.size = 1024;
4645 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4646 buffCI.queueFamilyIndexCount = 1;
4647 buffCI.pQueueFamilyIndices = &qfi;
4648
4649 VkBuffer dyub;
4650 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4651 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004652
Tony Barboure132c5f2016-12-12 11:50:20 -07004653 VkDeviceMemory mem;
4654 VkMemoryRequirements mem_reqs;
4655 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4656
4657 VkMemoryAllocateInfo mem_alloc_info = {};
4658 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4659 mem_alloc_info.allocationSize = mem_reqs.size;
4660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4661 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4662 ASSERT_VK_SUCCESS(err);
4663
4664 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4665 ASSERT_VK_SUCCESS(err);
4666
4667 VkDescriptorBufferInfo buffInfo[2] = {};
4668 buffInfo[0].buffer = dyub;
4669 buffInfo[0].offset = 0;
4670 buffInfo[0].range = 1024;
4671 buffInfo[1].buffer = dyub;
4672 buffInfo[1].offset = 0;
4673 buffInfo[1].range = 1024;
4674 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004675 descriptor_write.descriptorCount = 2;
4676
Mark Mueller5c838ce2016-06-16 09:54:29 -06004677 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004679 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4680 m_errorMonitor->VerifyFound();
4681
Mark Mueller5c838ce2016-06-16 09:54:29 -06004682 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4683 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004684 descriptor_write.dstBinding = 1;
4685 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004686
Mark Mueller5c838ce2016-06-16 09:54:29 -06004687 // Make pImageInfo index non-null to avoid complaints of it missing
4688 VkDescriptorImageInfo imageInfo = {};
4689 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4690 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004692 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4693 m_errorMonitor->VerifyFound();
4694
Mark Muellerd4914412016-06-13 17:52:06 -06004695 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004696 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004697 vkDestroySampler(m_device->device(), sampler, NULL);
4698 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4699 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4700 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4701}
4702
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004703TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004704 TEST_DESCRIPTION(
4705 "Attempt to draw with a command buffer that is invalid "
4706 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709 VkBuffer buffer;
4710 VkDeviceMemory mem;
4711 VkMemoryRequirements mem_reqs;
4712
4713 VkBufferCreateInfo buf_info = {};
4714 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004715 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004716 buf_info.size = 256;
4717 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4718 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4719 ASSERT_VK_SUCCESS(err);
4720
4721 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4722
4723 VkMemoryAllocateInfo alloc_info = {};
4724 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4725 alloc_info.allocationSize = 256;
4726 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004727 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 -06004728 if (!pass) {
4729 vkDestroyBuffer(m_device->device(), buffer, NULL);
4730 return;
4731 }
4732 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4733 ASSERT_VK_SUCCESS(err);
4734
4735 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4736 ASSERT_VK_SUCCESS(err);
4737
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004738 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004739 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004740 m_commandBuffer->EndCommandBuffer();
4741
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004743 // Destroy buffer dependency prior to submit to cause ERROR
4744 vkDestroyBuffer(m_device->device(), buffer, NULL);
4745
4746 VkSubmitInfo submit_info = {};
4747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4748 submit_info.commandBufferCount = 1;
4749 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4751
4752 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004753 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004754 vkFreeMemory(m_device->handle(), mem, NULL);
4755}
4756
Tobin Ehlisea413442016-09-28 10:23:59 -06004757TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4758 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4759
Tony Barbour1fa09702017-03-16 12:09:08 -06004760 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4762
4763 VkDescriptorPoolSize ds_type_count;
4764 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4765 ds_type_count.descriptorCount = 1;
4766
4767 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4768 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4769 ds_pool_ci.maxSets = 1;
4770 ds_pool_ci.poolSizeCount = 1;
4771 ds_pool_ci.pPoolSizes = &ds_type_count;
4772
4773 VkDescriptorPool ds_pool;
4774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4775 ASSERT_VK_SUCCESS(err);
4776
4777 VkDescriptorSetLayoutBinding layout_binding;
4778 layout_binding.binding = 0;
4779 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4780 layout_binding.descriptorCount = 1;
4781 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4782 layout_binding.pImmutableSamplers = NULL;
4783
4784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4786 ds_layout_ci.bindingCount = 1;
4787 ds_layout_ci.pBindings = &layout_binding;
4788 VkDescriptorSetLayout ds_layout;
4789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4790 ASSERT_VK_SUCCESS(err);
4791
4792 VkDescriptorSetAllocateInfo alloc_info = {};
4793 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4794 alloc_info.descriptorSetCount = 1;
4795 alloc_info.descriptorPool = ds_pool;
4796 alloc_info.pSetLayouts = &ds_layout;
4797 VkDescriptorSet descriptor_set;
4798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4799 ASSERT_VK_SUCCESS(err);
4800
4801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4802 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4803 pipeline_layout_ci.pNext = NULL;
4804 pipeline_layout_ci.setLayoutCount = 1;
4805 pipeline_layout_ci.pSetLayouts = &ds_layout;
4806
4807 VkPipelineLayout pipeline_layout;
4808 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBuffer buffer;
4812 uint32_t queue_family_index = 0;
4813 VkBufferCreateInfo buffer_create_info = {};
4814 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4815 buffer_create_info.size = 1024;
4816 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4817 buffer_create_info.queueFamilyIndexCount = 1;
4818 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4819
4820 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 VkMemoryRequirements memory_reqs;
4824 VkDeviceMemory buffer_memory;
4825
4826 VkMemoryAllocateInfo memory_info = {};
4827 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4828 memory_info.allocationSize = 0;
4829 memory_info.memoryTypeIndex = 0;
4830
4831 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4832 memory_info.allocationSize = memory_reqs.size;
4833 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4834 ASSERT_TRUE(pass);
4835
4836 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4837 ASSERT_VK_SUCCESS(err);
4838 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4839 ASSERT_VK_SUCCESS(err);
4840
4841 VkBufferView view;
4842 VkBufferViewCreateInfo bvci = {};
4843 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4844 bvci.buffer = buffer;
4845 bvci.format = VK_FORMAT_R8_UNORM;
4846 bvci.range = VK_WHOLE_SIZE;
4847
4848 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4849 ASSERT_VK_SUCCESS(err);
4850
4851 VkWriteDescriptorSet descriptor_write = {};
4852 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4853 descriptor_write.dstSet = descriptor_set;
4854 descriptor_write.dstBinding = 0;
4855 descriptor_write.descriptorCount = 1;
4856 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4857 descriptor_write.pTexelBufferView = &view;
4858
4859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4860
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004861 char const *vsSource =
4862 "#version 450\n"
4863 "\n"
4864 "out gl_PerVertex { \n"
4865 " vec4 gl_Position;\n"
4866 "};\n"
4867 "void main(){\n"
4868 " gl_Position = vec4(1);\n"
4869 "}\n";
4870 char const *fsSource =
4871 "#version 450\n"
4872 "\n"
4873 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4874 "layout(location=0) out vec4 x;\n"
4875 "void main(){\n"
4876 " x = imageLoad(s, 0);\n"
4877 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4880 VkPipelineObj pipe(m_device);
4881 pipe.AddShader(&vs);
4882 pipe.AddShader(&fs);
4883 pipe.AddColorAttachment();
4884 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4885
Tobin Ehlisea413442016-09-28 10:23:59 -06004886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4887
Tony Barbour552f6c02016-12-21 14:34:07 -07004888 m_commandBuffer->BeginCommandBuffer();
4889 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4890
Tobin Ehlisea413442016-09-28 10:23:59 -06004891 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4892 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4893 VkRect2D scissor = {{0, 0}, {16, 16}};
4894 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4895 // Bind pipeline to cmd buffer
4896 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4897 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4898 &descriptor_set, 0, nullptr);
4899 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004900 m_commandBuffer->EndRenderPass();
4901 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004902
4903 // Delete BufferView in order to invalidate cmd buffer
4904 vkDestroyBufferView(m_device->device(), view, NULL);
4905 // Now attempt submit of cmd buffer
4906 VkSubmitInfo submit_info = {};
4907 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4908 submit_info.commandBufferCount = 1;
4909 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4910 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4911 m_errorMonitor->VerifyFound();
4912
4913 // Clean-up
4914 vkDestroyBuffer(m_device->device(), buffer, NULL);
4915 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4916 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4917 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4919}
4920
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004921TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004922 TEST_DESCRIPTION(
4923 "Attempt to draw with a command buffer that is invalid "
4924 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004925 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004926
4927 VkImage image;
4928 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4929 VkImageCreateInfo image_create_info = {};
4930 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4931 image_create_info.pNext = NULL;
4932 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4933 image_create_info.format = tex_format;
4934 image_create_info.extent.width = 32;
4935 image_create_info.extent.height = 32;
4936 image_create_info.extent.depth = 1;
4937 image_create_info.mipLevels = 1;
4938 image_create_info.arrayLayers = 1;
4939 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4940 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004941 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004942 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004943 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004944 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004945 // Have to bind memory to image before recording cmd in cmd buffer using it
4946 VkMemoryRequirements mem_reqs;
4947 VkDeviceMemory image_mem;
4948 bool pass;
4949 VkMemoryAllocateInfo mem_alloc = {};
4950 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4951 mem_alloc.pNext = NULL;
4952 mem_alloc.memoryTypeIndex = 0;
4953 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4954 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004955 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004956 ASSERT_TRUE(pass);
4957 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4958 ASSERT_VK_SUCCESS(err);
4959 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4960 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004961
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004962 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004963 VkClearColorValue ccv;
4964 ccv.float32[0] = 1.0f;
4965 ccv.float32[1] = 1.0f;
4966 ccv.float32[2] = 1.0f;
4967 ccv.float32[3] = 1.0f;
4968 VkImageSubresourceRange isr = {};
4969 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004970 isr.baseArrayLayer = 0;
4971 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004972 isr.layerCount = 1;
4973 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004974 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004975 m_commandBuffer->EndCommandBuffer();
4976
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004978 // Destroy image dependency prior to submit to cause ERROR
4979 vkDestroyImage(m_device->device(), image, NULL);
4980
4981 VkSubmitInfo submit_info = {};
4982 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4983 submit_info.commandBufferCount = 1;
4984 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4985 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4986
4987 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004988 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004989}
4990
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004991TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004992 TEST_DESCRIPTION(
4993 "Attempt to draw with a command buffer that is invalid "
4994 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004995 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004996 VkFormatProperties format_properties;
4997 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004998 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4999 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005000 return;
5001 }
5002
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5004
5005 VkImageCreateInfo image_ci = {};
5006 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5007 image_ci.pNext = NULL;
5008 image_ci.imageType = VK_IMAGE_TYPE_2D;
5009 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5010 image_ci.extent.width = 32;
5011 image_ci.extent.height = 32;
5012 image_ci.extent.depth = 1;
5013 image_ci.mipLevels = 1;
5014 image_ci.arrayLayers = 1;
5015 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5016 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5019 image_ci.flags = 0;
5020 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005021 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005022
5023 VkMemoryRequirements memory_reqs;
5024 VkDeviceMemory image_memory;
5025 bool pass;
5026 VkMemoryAllocateInfo memory_info = {};
5027 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5028 memory_info.pNext = NULL;
5029 memory_info.allocationSize = 0;
5030 memory_info.memoryTypeIndex = 0;
5031 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5032 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005035 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005036 ASSERT_VK_SUCCESS(err);
5037 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5038 ASSERT_VK_SUCCESS(err);
5039
5040 VkImageViewCreateInfo ivci = {
5041 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5042 nullptr,
5043 0,
5044 image,
5045 VK_IMAGE_VIEW_TYPE_2D,
5046 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005048 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5049 };
5050 VkImageView view;
5051 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5052 ASSERT_VK_SUCCESS(err);
5053
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005055 VkFramebuffer fb;
5056 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5057 ASSERT_VK_SUCCESS(err);
5058
5059 // Just use default renderpass with our framebuffer
5060 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005061 m_renderPassBeginInfo.renderArea.extent.width = 32;
5062 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005063 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005064 m_commandBuffer->BeginCommandBuffer();
5065 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5066 m_commandBuffer->EndRenderPass();
5067 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005068 // Destroy image attached to framebuffer to invalidate cmd buffer
5069 vkDestroyImage(m_device->device(), image, NULL);
5070 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005072 QueueCommandBuffer(false);
5073 m_errorMonitor->VerifyFound();
5074
5075 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5076 vkDestroyImageView(m_device->device(), view, nullptr);
5077 vkFreeMemory(m_device->device(), image_memory, nullptr);
5078}
5079
Tobin Ehlisb329f992016-10-12 13:20:29 -06005080TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5081 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005082 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005083 VkFormatProperties format_properties;
5084 VkResult err = VK_SUCCESS;
5085 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5086
Tobin Ehlisb329f992016-10-12 13:20:29 -06005087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5088
5089 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005090 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 -06005091 ASSERT_TRUE(image.initialized());
5092 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5093
5094 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5095 VkFramebuffer fb;
5096 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5097 ASSERT_VK_SUCCESS(err);
5098
5099 // Just use default renderpass with our framebuffer
5100 m_renderPassBeginInfo.framebuffer = fb;
5101 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005102 m_commandBuffer->BeginCommandBuffer();
5103 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5104 m_commandBuffer->EndRenderPass();
5105 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005106 // Submit cmd buffer to put it in-flight
5107 VkSubmitInfo submit_info = {};
5108 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5109 submit_info.commandBufferCount = 1;
5110 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5111 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5112 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005114 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5115 m_errorMonitor->VerifyFound();
5116 // Wait for queue to complete so we can safely destroy everything
5117 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005118 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5119 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005120 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5121}
5122
Tobin Ehlis88becd72016-09-21 14:33:41 -06005123TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5124 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005125 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005126 VkFormatProperties format_properties;
5127 VkResult err = VK_SUCCESS;
5128 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005129
Tobin Ehlis88becd72016-09-21 14:33:41 -06005130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5131
5132 VkImageCreateInfo image_ci = {};
5133 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5134 image_ci.pNext = NULL;
5135 image_ci.imageType = VK_IMAGE_TYPE_2D;
5136 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5137 image_ci.extent.width = 256;
5138 image_ci.extent.height = 256;
5139 image_ci.extent.depth = 1;
5140 image_ci.mipLevels = 1;
5141 image_ci.arrayLayers = 1;
5142 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5143 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005144 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005145 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5146 image_ci.flags = 0;
5147 VkImage image;
5148 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5149
5150 VkMemoryRequirements memory_reqs;
5151 VkDeviceMemory image_memory;
5152 bool pass;
5153 VkMemoryAllocateInfo memory_info = {};
5154 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5155 memory_info.pNext = NULL;
5156 memory_info.allocationSize = 0;
5157 memory_info.memoryTypeIndex = 0;
5158 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5159 memory_info.allocationSize = memory_reqs.size;
5160 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5161 ASSERT_TRUE(pass);
5162 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5163 ASSERT_VK_SUCCESS(err);
5164 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5165 ASSERT_VK_SUCCESS(err);
5166
5167 VkImageViewCreateInfo ivci = {
5168 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5169 nullptr,
5170 0,
5171 image,
5172 VK_IMAGE_VIEW_TYPE_2D,
5173 VK_FORMAT_B8G8R8A8_UNORM,
5174 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5175 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5176 };
5177 VkImageView view;
5178 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5179 ASSERT_VK_SUCCESS(err);
5180
5181 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5182 VkFramebuffer fb;
5183 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5184 ASSERT_VK_SUCCESS(err);
5185
5186 // Just use default renderpass with our framebuffer
5187 m_renderPassBeginInfo.framebuffer = fb;
5188 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005189 m_commandBuffer->BeginCommandBuffer();
5190 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5191 m_commandBuffer->EndRenderPass();
5192 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005193 // Submit cmd buffer to put it (and attached imageView) in-flight
5194 VkSubmitInfo submit_info = {};
5195 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5196 submit_info.commandBufferCount = 1;
5197 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5198 // Submit cmd buffer to put framebuffer and children in-flight
5199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5200 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005202 vkDestroyImage(m_device->device(), image, NULL);
5203 m_errorMonitor->VerifyFound();
5204 // Wait for queue to complete so we can safely destroy image and other objects
5205 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005206 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5207 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005208 vkDestroyImage(m_device->device(), image, NULL);
5209 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5210 vkDestroyImageView(m_device->device(), view, nullptr);
5211 vkFreeMemory(m_device->device(), image_memory, nullptr);
5212}
5213
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005214TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5215 TEST_DESCRIPTION("Delete in-use renderPass.");
5216
Tony Barbour1fa09702017-03-16 12:09:08 -06005217 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5219
5220 // Create simple renderpass
5221 VkAttachmentReference attach = {};
5222 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5223 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005224 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005225 subpass.pColorAttachments = &attach;
5226 VkRenderPassCreateInfo rpci = {};
5227 rpci.subpassCount = 1;
5228 rpci.pSubpasses = &subpass;
5229 rpci.attachmentCount = 1;
5230 VkAttachmentDescription attach_desc = {};
5231 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5232 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5233 rpci.pAttachments = &attach_desc;
5234 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5235 VkRenderPass rp;
5236 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5237 ASSERT_VK_SUCCESS(err);
5238
5239 // Create a pipeline that uses the given renderpass
5240 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5241 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5242
5243 VkPipelineLayout pipeline_layout;
5244 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5245 ASSERT_VK_SUCCESS(err);
5246
5247 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5248 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5249 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005250 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005251 vp_state_ci.pViewports = &vp;
5252 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005253 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005254 vp_state_ci.pScissors = &scissors;
5255
5256 VkPipelineShaderStageCreateInfo shaderStages[2];
5257 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5258
5259 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005260 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 -06005261 // but add it to be able to run on more devices
5262 shaderStages[0] = vs.GetStageCreateInfo();
5263 shaderStages[1] = fs.GetStageCreateInfo();
5264
5265 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5266 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5267
5268 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5269 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5270 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5271
5272 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5273 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5274 rs_ci.rasterizerDiscardEnable = true;
5275 rs_ci.lineWidth = 1.0f;
5276
5277 VkPipelineColorBlendAttachmentState att = {};
5278 att.blendEnable = VK_FALSE;
5279 att.colorWriteMask = 0xf;
5280
5281 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5282 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5283 cb_ci.attachmentCount = 1;
5284 cb_ci.pAttachments = &att;
5285
5286 VkGraphicsPipelineCreateInfo gp_ci = {};
5287 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5288 gp_ci.stageCount = 2;
5289 gp_ci.pStages = shaderStages;
5290 gp_ci.pVertexInputState = &vi_ci;
5291 gp_ci.pInputAssemblyState = &ia_ci;
5292 gp_ci.pViewportState = &vp_state_ci;
5293 gp_ci.pRasterizationState = &rs_ci;
5294 gp_ci.pColorBlendState = &cb_ci;
5295 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5296 gp_ci.layout = pipeline_layout;
5297 gp_ci.renderPass = rp;
5298
5299 VkPipelineCacheCreateInfo pc_ci = {};
5300 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5301
Dave Houlton756e6742017-03-23 14:33:22 -06005302 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005303 VkPipeline pipeline;
5304 VkPipelineCache pipe_cache;
5305 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5306 ASSERT_VK_SUCCESS(err);
5307
5308 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5309 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005310
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005311 // Bind pipeline to cmd buffer, will also bind renderpass
5312 m_commandBuffer->BeginCommandBuffer();
5313 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5314 m_commandBuffer->EndCommandBuffer();
5315
5316 VkSubmitInfo submit_info = {};
5317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5318 submit_info.commandBufferCount = 1;
5319 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005321 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005322
5323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5324 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5325 m_errorMonitor->VerifyFound();
5326
5327 // Wait for queue to complete so we can safely destroy everything
5328 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005329 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5330 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005331 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5332 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5333 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5334 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5335}
5336
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005337TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005338 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005339 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340
5341 VkImage image;
5342 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5343 VkImageCreateInfo image_create_info = {};
5344 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5345 image_create_info.pNext = NULL;
5346 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5347 image_create_info.format = tex_format;
5348 image_create_info.extent.width = 32;
5349 image_create_info.extent.height = 32;
5350 image_create_info.extent.depth = 1;
5351 image_create_info.mipLevels = 1;
5352 image_create_info.arrayLayers = 1;
5353 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5354 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005355 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005356 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005357 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005358 ASSERT_VK_SUCCESS(err);
5359 // Have to bind memory to image before recording cmd in cmd buffer using it
5360 VkMemoryRequirements mem_reqs;
5361 VkDeviceMemory image_mem;
5362 bool pass;
5363 VkMemoryAllocateInfo mem_alloc = {};
5364 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5365 mem_alloc.pNext = NULL;
5366 mem_alloc.memoryTypeIndex = 0;
5367 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5368 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370 ASSERT_TRUE(pass);
5371 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5372 ASSERT_VK_SUCCESS(err);
5373
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005374 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005376 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005377
5378 m_commandBuffer->BeginCommandBuffer();
5379 VkClearColorValue ccv;
5380 ccv.float32[0] = 1.0f;
5381 ccv.float32[1] = 1.0f;
5382 ccv.float32[2] = 1.0f;
5383 ccv.float32[3] = 1.0f;
5384 VkImageSubresourceRange isr = {};
5385 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5386 isr.baseArrayLayer = 0;
5387 isr.baseMipLevel = 0;
5388 isr.layerCount = 1;
5389 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005390 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005391 m_commandBuffer->EndCommandBuffer();
5392
5393 m_errorMonitor->VerifyFound();
5394 vkDestroyImage(m_device->device(), image, NULL);
5395 vkFreeMemory(m_device->device(), image_mem, nullptr);
5396}
5397
5398TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005399 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005400 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005401
5402 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005403 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 -06005404 VK_IMAGE_TILING_OPTIMAL, 0);
5405 ASSERT_TRUE(image.initialized());
5406
5407 VkBuffer buffer;
5408 VkDeviceMemory mem;
5409 VkMemoryRequirements mem_reqs;
5410
5411 VkBufferCreateInfo buf_info = {};
5412 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005413 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005414 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005415 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5416 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5417 ASSERT_VK_SUCCESS(err);
5418
5419 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5420
5421 VkMemoryAllocateInfo alloc_info = {};
5422 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005423 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005424 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005425 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 -06005426 if (!pass) {
5427 vkDestroyBuffer(m_device->device(), buffer, NULL);
5428 return;
5429 }
5430 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5431 ASSERT_VK_SUCCESS(err);
5432
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005433 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005435 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005436 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005437 region.bufferRowLength = 16;
5438 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005439 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5440
5441 region.imageSubresource.layerCount = 1;
5442 region.imageExtent.height = 4;
5443 region.imageExtent.width = 4;
5444 region.imageExtent.depth = 1;
5445 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005446 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5447 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005448 m_commandBuffer->EndCommandBuffer();
5449
5450 m_errorMonitor->VerifyFound();
5451
5452 vkDestroyBuffer(m_device->device(), buffer, NULL);
5453 vkFreeMemory(m_device->handle(), mem, NULL);
5454}
5455
Tobin Ehlis85940f52016-07-07 16:57:21 -06005456TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005457 TEST_DESCRIPTION(
5458 "Attempt to draw with a command buffer that is invalid "
5459 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005460 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005461
5462 VkEvent event;
5463 VkEventCreateInfo evci = {};
5464 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5465 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5466 ASSERT_VK_SUCCESS(result);
5467
5468 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005469 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005470 m_commandBuffer->EndCommandBuffer();
5471
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005473 // Destroy event dependency prior to submit to cause ERROR
5474 vkDestroyEvent(m_device->device(), event, NULL);
5475
5476 VkSubmitInfo submit_info = {};
5477 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5478 submit_info.commandBufferCount = 1;
5479 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5480 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5481
5482 m_errorMonitor->VerifyFound();
5483}
5484
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005485TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005486 TEST_DESCRIPTION(
5487 "Attempt to draw with a command buffer that is invalid "
5488 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005489 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005490
5491 VkQueryPool query_pool;
5492 VkQueryPoolCreateInfo qpci{};
5493 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5494 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5495 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005496 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005497 ASSERT_VK_SUCCESS(result);
5498
5499 m_commandBuffer->BeginCommandBuffer();
5500 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5501 m_commandBuffer->EndCommandBuffer();
5502
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005504 // Destroy query pool dependency prior to submit to cause ERROR
5505 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5506
5507 VkSubmitInfo submit_info = {};
5508 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5509 submit_info.commandBufferCount = 1;
5510 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5511 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5512
5513 m_errorMonitor->VerifyFound();
5514}
5515
Tobin Ehlis24130d92016-07-08 15:50:53 -06005516TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005517 TEST_DESCRIPTION(
5518 "Attempt to draw with a command buffer that is invalid "
5519 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005520 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5522
5523 VkResult err;
5524
5525 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5526 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5527
5528 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005529 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005530 ASSERT_VK_SUCCESS(err);
5531
5532 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5533 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5534 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005535 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005536 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005537 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005538 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005539 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005540
5541 VkPipelineShaderStageCreateInfo shaderStages[2];
5542 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5543
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005544 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005545 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 -06005546 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005547 shaderStages[0] = vs.GetStageCreateInfo();
5548 shaderStages[1] = fs.GetStageCreateInfo();
5549
5550 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5551 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5552
5553 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5554 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5555 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5556
5557 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5558 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005559 rs_ci.rasterizerDiscardEnable = true;
5560 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005561
5562 VkPipelineColorBlendAttachmentState att = {};
5563 att.blendEnable = VK_FALSE;
5564 att.colorWriteMask = 0xf;
5565
5566 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5567 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5568 cb_ci.attachmentCount = 1;
5569 cb_ci.pAttachments = &att;
5570
5571 VkGraphicsPipelineCreateInfo gp_ci = {};
5572 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5573 gp_ci.stageCount = 2;
5574 gp_ci.pStages = shaderStages;
5575 gp_ci.pVertexInputState = &vi_ci;
5576 gp_ci.pInputAssemblyState = &ia_ci;
5577 gp_ci.pViewportState = &vp_state_ci;
5578 gp_ci.pRasterizationState = &rs_ci;
5579 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005580 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5581 gp_ci.layout = pipeline_layout;
5582 gp_ci.renderPass = renderPass();
5583
5584 VkPipelineCacheCreateInfo pc_ci = {};
5585 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5586
5587 VkPipeline pipeline;
5588 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005589 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005590 ASSERT_VK_SUCCESS(err);
5591
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005592 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005593 ASSERT_VK_SUCCESS(err);
5594
5595 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005596 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005597 m_commandBuffer->EndCommandBuffer();
5598 // Now destroy pipeline in order to cause error when submitting
5599 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5600
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005602
5603 VkSubmitInfo submit_info = {};
5604 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5605 submit_info.commandBufferCount = 1;
5606 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5607 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5608
5609 m_errorMonitor->VerifyFound();
5610 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5611 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5612}
5613
Tobin Ehlis31289162016-08-17 14:57:58 -06005614TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005615 TEST_DESCRIPTION(
5616 "Attempt to draw with a command buffer that is invalid "
5617 "due to a bound descriptor set with a buffer dependency "
5618 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005619 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005620 ASSERT_NO_FATAL_FAILURE(InitViewport());
5621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5622
5623 VkDescriptorPoolSize ds_type_count = {};
5624 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5625 ds_type_count.descriptorCount = 1;
5626
5627 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5628 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5629 ds_pool_ci.pNext = NULL;
5630 ds_pool_ci.maxSets = 1;
5631 ds_pool_ci.poolSizeCount = 1;
5632 ds_pool_ci.pPoolSizes = &ds_type_count;
5633
5634 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005635 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005636 ASSERT_VK_SUCCESS(err);
5637
5638 VkDescriptorSetLayoutBinding dsl_binding = {};
5639 dsl_binding.binding = 0;
5640 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5641 dsl_binding.descriptorCount = 1;
5642 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5643 dsl_binding.pImmutableSamplers = NULL;
5644
5645 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5646 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5647 ds_layout_ci.pNext = NULL;
5648 ds_layout_ci.bindingCount = 1;
5649 ds_layout_ci.pBindings = &dsl_binding;
5650 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005651 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005652 ASSERT_VK_SUCCESS(err);
5653
5654 VkDescriptorSet descriptorSet;
5655 VkDescriptorSetAllocateInfo alloc_info = {};
5656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5657 alloc_info.descriptorSetCount = 1;
5658 alloc_info.descriptorPool = ds_pool;
5659 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005661 ASSERT_VK_SUCCESS(err);
5662
5663 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5664 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5665 pipeline_layout_ci.pNext = NULL;
5666 pipeline_layout_ci.setLayoutCount = 1;
5667 pipeline_layout_ci.pSetLayouts = &ds_layout;
5668
5669 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005670 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005671 ASSERT_VK_SUCCESS(err);
5672
5673 // Create a buffer to update the descriptor with
5674 uint32_t qfi = 0;
5675 VkBufferCreateInfo buffCI = {};
5676 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5677 buffCI.size = 1024;
5678 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5679 buffCI.queueFamilyIndexCount = 1;
5680 buffCI.pQueueFamilyIndices = &qfi;
5681
5682 VkBuffer buffer;
5683 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5684 ASSERT_VK_SUCCESS(err);
5685 // Allocate memory and bind to buffer so we can make it to the appropriate
5686 // error
5687 VkMemoryAllocateInfo mem_alloc = {};
5688 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5689 mem_alloc.pNext = NULL;
5690 mem_alloc.allocationSize = 1024;
5691 mem_alloc.memoryTypeIndex = 0;
5692
5693 VkMemoryRequirements memReqs;
5694 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005695 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005696 if (!pass) {
5697 vkDestroyBuffer(m_device->device(), buffer, NULL);
5698 return;
5699 }
5700
5701 VkDeviceMemory mem;
5702 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5703 ASSERT_VK_SUCCESS(err);
5704 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5705 ASSERT_VK_SUCCESS(err);
5706 // Correctly update descriptor to avoid "NOT_UPDATED" error
5707 VkDescriptorBufferInfo buffInfo = {};
5708 buffInfo.buffer = buffer;
5709 buffInfo.offset = 0;
5710 buffInfo.range = 1024;
5711
5712 VkWriteDescriptorSet descriptor_write;
5713 memset(&descriptor_write, 0, sizeof(descriptor_write));
5714 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5715 descriptor_write.dstSet = descriptorSet;
5716 descriptor_write.dstBinding = 0;
5717 descriptor_write.descriptorCount = 1;
5718 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5719 descriptor_write.pBufferInfo = &buffInfo;
5720
5721 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5722
5723 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005724 char const *vsSource =
5725 "#version 450\n"
5726 "\n"
5727 "out gl_PerVertex { \n"
5728 " vec4 gl_Position;\n"
5729 "};\n"
5730 "void main(){\n"
5731 " gl_Position = vec4(1);\n"
5732 "}\n";
5733 char const *fsSource =
5734 "#version 450\n"
5735 "\n"
5736 "layout(location=0) out vec4 x;\n"
5737 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5738 "void main(){\n"
5739 " x = vec4(bar.y);\n"
5740 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5743 VkPipelineObj pipe(m_device);
5744 pipe.AddShader(&vs);
5745 pipe.AddShader(&fs);
5746 pipe.AddColorAttachment();
5747 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5748
Tony Barbour552f6c02016-12-21 14:34:07 -07005749 m_commandBuffer->BeginCommandBuffer();
5750 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005751 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5752 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5753 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005754
5755 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5756 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5757
Tobin Ehlis31289162016-08-17 14:57:58 -06005758 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005759 m_commandBuffer->EndRenderPass();
5760 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005762 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5763 vkDestroyBuffer(m_device->device(), buffer, NULL);
5764 // Attempt to submit cmd buffer
5765 VkSubmitInfo submit_info = {};
5766 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5767 submit_info.commandBufferCount = 1;
5768 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5769 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5770 m_errorMonitor->VerifyFound();
5771 // Cleanup
5772 vkFreeMemory(m_device->device(), mem, NULL);
5773
5774 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5775 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5776 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5777}
5778
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005779TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005780 TEST_DESCRIPTION(
5781 "Attempt to draw with a command buffer that is invalid "
5782 "due to a bound descriptor sets with a combined image "
5783 "sampler having their image, sampler, and descriptor set "
5784 "each respectively destroyed and then attempting to "
5785 "submit associated cmd buffers. Attempt to destroy a "
5786 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005787 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005788 ASSERT_NO_FATAL_FAILURE(InitViewport());
5789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5790
5791 VkDescriptorPoolSize ds_type_count = {};
5792 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5793 ds_type_count.descriptorCount = 1;
5794
5795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5797 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005798 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005799 ds_pool_ci.maxSets = 1;
5800 ds_pool_ci.poolSizeCount = 1;
5801 ds_pool_ci.pPoolSizes = &ds_type_count;
5802
5803 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005804 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005805 ASSERT_VK_SUCCESS(err);
5806
5807 VkDescriptorSetLayoutBinding dsl_binding = {};
5808 dsl_binding.binding = 0;
5809 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5810 dsl_binding.descriptorCount = 1;
5811 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5812 dsl_binding.pImmutableSamplers = NULL;
5813
5814 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5815 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5816 ds_layout_ci.pNext = NULL;
5817 ds_layout_ci.bindingCount = 1;
5818 ds_layout_ci.pBindings = &dsl_binding;
5819 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005820 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005821 ASSERT_VK_SUCCESS(err);
5822
5823 VkDescriptorSet descriptorSet;
5824 VkDescriptorSetAllocateInfo alloc_info = {};
5825 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5826 alloc_info.descriptorSetCount = 1;
5827 alloc_info.descriptorPool = ds_pool;
5828 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005829 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005830 ASSERT_VK_SUCCESS(err);
5831
5832 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5833 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5834 pipeline_layout_ci.pNext = NULL;
5835 pipeline_layout_ci.setLayoutCount = 1;
5836 pipeline_layout_ci.pSetLayouts = &ds_layout;
5837
5838 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005839 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005840 ASSERT_VK_SUCCESS(err);
5841
5842 // Create images to update the descriptor with
5843 VkImage image;
5844 VkImage image2;
5845 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5846 const int32_t tex_width = 32;
5847 const int32_t tex_height = 32;
5848 VkImageCreateInfo image_create_info = {};
5849 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5850 image_create_info.pNext = NULL;
5851 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5852 image_create_info.format = tex_format;
5853 image_create_info.extent.width = tex_width;
5854 image_create_info.extent.height = tex_height;
5855 image_create_info.extent.depth = 1;
5856 image_create_info.mipLevels = 1;
5857 image_create_info.arrayLayers = 1;
5858 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5859 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5860 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5861 image_create_info.flags = 0;
5862 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5863 ASSERT_VK_SUCCESS(err);
5864 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5865 ASSERT_VK_SUCCESS(err);
5866
5867 VkMemoryRequirements memory_reqs;
5868 VkDeviceMemory image_memory;
5869 bool pass;
5870 VkMemoryAllocateInfo memory_info = {};
5871 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5872 memory_info.pNext = NULL;
5873 memory_info.allocationSize = 0;
5874 memory_info.memoryTypeIndex = 0;
5875 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5876 // Allocate enough memory for both images
5877 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005878 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005879 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005880 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005881 ASSERT_VK_SUCCESS(err);
5882 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5883 ASSERT_VK_SUCCESS(err);
5884 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005885 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005886 ASSERT_VK_SUCCESS(err);
5887
5888 VkImageViewCreateInfo image_view_create_info = {};
5889 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5890 image_view_create_info.image = image;
5891 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5892 image_view_create_info.format = tex_format;
5893 image_view_create_info.subresourceRange.layerCount = 1;
5894 image_view_create_info.subresourceRange.baseMipLevel = 0;
5895 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005896 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005897
5898 VkImageView view;
5899 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005900 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005901 ASSERT_VK_SUCCESS(err);
5902 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005903 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005904 ASSERT_VK_SUCCESS(err);
5905 // Create Samplers
5906 VkSamplerCreateInfo sampler_ci = {};
5907 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5908 sampler_ci.pNext = NULL;
5909 sampler_ci.magFilter = VK_FILTER_NEAREST;
5910 sampler_ci.minFilter = VK_FILTER_NEAREST;
5911 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5912 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5913 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5914 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5915 sampler_ci.mipLodBias = 1.0;
5916 sampler_ci.anisotropyEnable = VK_FALSE;
5917 sampler_ci.maxAnisotropy = 1;
5918 sampler_ci.compareEnable = VK_FALSE;
5919 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5920 sampler_ci.minLod = 1.0;
5921 sampler_ci.maxLod = 1.0;
5922 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5923 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5924 VkSampler sampler;
5925 VkSampler sampler2;
5926 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5927 ASSERT_VK_SUCCESS(err);
5928 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5929 ASSERT_VK_SUCCESS(err);
5930 // Update descriptor with image and sampler
5931 VkDescriptorImageInfo img_info = {};
5932 img_info.sampler = sampler;
5933 img_info.imageView = view;
5934 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5935
5936 VkWriteDescriptorSet descriptor_write;
5937 memset(&descriptor_write, 0, sizeof(descriptor_write));
5938 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5939 descriptor_write.dstSet = descriptorSet;
5940 descriptor_write.dstBinding = 0;
5941 descriptor_write.descriptorCount = 1;
5942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5943 descriptor_write.pImageInfo = &img_info;
5944
5945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5946
5947 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005948 char const *vsSource =
5949 "#version 450\n"
5950 "\n"
5951 "out gl_PerVertex { \n"
5952 " vec4 gl_Position;\n"
5953 "};\n"
5954 "void main(){\n"
5955 " gl_Position = vec4(1);\n"
5956 "}\n";
5957 char const *fsSource =
5958 "#version 450\n"
5959 "\n"
5960 "layout(set=0, binding=0) uniform sampler2D s;\n"
5961 "layout(location=0) out vec4 x;\n"
5962 "void main(){\n"
5963 " x = texture(s, vec2(1));\n"
5964 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5967 VkPipelineObj pipe(m_device);
5968 pipe.AddShader(&vs);
5969 pipe.AddShader(&fs);
5970 pipe.AddColorAttachment();
5971 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5972
5973 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005975 m_commandBuffer->BeginCommandBuffer();
5976 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005977 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5978 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5979 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005980 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5981 VkRect2D scissor = {{0, 0}, {16, 16}};
5982 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5983 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005984 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005985 m_commandBuffer->EndRenderPass();
5986 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005987 // Destroy sampler invalidates the cmd buffer, causing error on submit
5988 vkDestroySampler(m_device->device(), sampler, NULL);
5989 // Attempt to submit cmd buffer
5990 VkSubmitInfo submit_info = {};
5991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5992 submit_info.commandBufferCount = 1;
5993 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5994 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5995 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005996
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005997 // Now re-update descriptor with valid sampler and delete image
5998 img_info.sampler = sampler2;
5999 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006000
6001 VkCommandBufferBeginInfo info = {};
6002 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6003 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6004
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006006 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006007 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006008 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6009 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6010 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006011 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6012 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006013 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006014 m_commandBuffer->EndRenderPass();
6015 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006016 // Destroy image invalidates the cmd buffer, causing error on submit
6017 vkDestroyImage(m_device->device(), image, NULL);
6018 // Attempt to submit cmd buffer
6019 submit_info = {};
6020 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6021 submit_info.commandBufferCount = 1;
6022 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6024 m_errorMonitor->VerifyFound();
6025 // Now update descriptor to be valid, but then free descriptor
6026 img_info.imageView = view2;
6027 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006028 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006029 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6031 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6032 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006033 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6034 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006035 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006036 m_commandBuffer->EndRenderPass();
6037 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006038 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006039
6040 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006042 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006043 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006044
6045 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006046 // 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 -07006047 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006048 m_errorMonitor->SetUnexpectedError(
6049 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6050 "either be a valid handle or VK_NULL_HANDLE");
6051 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006052 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6053
6054 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006055 submit_info = {};
6056 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6057 submit_info.commandBufferCount = 1;
6058 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006060 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6061 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006062
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006063 // Cleanup
6064 vkFreeMemory(m_device->device(), image_memory, NULL);
6065 vkDestroySampler(m_device->device(), sampler2, NULL);
6066 vkDestroyImage(m_device->device(), image2, NULL);
6067 vkDestroyImageView(m_device->device(), view, NULL);
6068 vkDestroyImageView(m_device->device(), view2, NULL);
6069 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6070 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6071 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6072}
6073
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006074TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6075 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006076 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006077 ASSERT_NO_FATAL_FAILURE(InitViewport());
6078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6079
6080 VkDescriptorPoolSize ds_type_count = {};
6081 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6082 ds_type_count.descriptorCount = 1;
6083
6084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6086 ds_pool_ci.pNext = NULL;
6087 ds_pool_ci.maxSets = 1;
6088 ds_pool_ci.poolSizeCount = 1;
6089 ds_pool_ci.pPoolSizes = &ds_type_count;
6090
6091 VkDescriptorPool ds_pool;
6092 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6093 ASSERT_VK_SUCCESS(err);
6094
6095 VkDescriptorSetLayoutBinding dsl_binding = {};
6096 dsl_binding.binding = 0;
6097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6098 dsl_binding.descriptorCount = 1;
6099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6100 dsl_binding.pImmutableSamplers = NULL;
6101
6102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6104 ds_layout_ci.pNext = NULL;
6105 ds_layout_ci.bindingCount = 1;
6106 ds_layout_ci.pBindings = &dsl_binding;
6107 VkDescriptorSetLayout ds_layout;
6108 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6109 ASSERT_VK_SUCCESS(err);
6110
6111 VkDescriptorSet descriptor_set;
6112 VkDescriptorSetAllocateInfo alloc_info = {};
6113 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6114 alloc_info.descriptorSetCount = 1;
6115 alloc_info.descriptorPool = ds_pool;
6116 alloc_info.pSetLayouts = &ds_layout;
6117 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6118 ASSERT_VK_SUCCESS(err);
6119
6120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6122 pipeline_layout_ci.pNext = NULL;
6123 pipeline_layout_ci.setLayoutCount = 1;
6124 pipeline_layout_ci.pSetLayouts = &ds_layout;
6125
6126 VkPipelineLayout pipeline_layout;
6127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6128 ASSERT_VK_SUCCESS(err);
6129
6130 // Create image to update the descriptor with
6131 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006132 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 -06006133 ASSERT_TRUE(image.initialized());
6134
6135 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6136 // Create Sampler
6137 VkSamplerCreateInfo sampler_ci = {};
6138 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6139 sampler_ci.pNext = NULL;
6140 sampler_ci.magFilter = VK_FILTER_NEAREST;
6141 sampler_ci.minFilter = VK_FILTER_NEAREST;
6142 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6143 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6144 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6145 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6146 sampler_ci.mipLodBias = 1.0;
6147 sampler_ci.anisotropyEnable = VK_FALSE;
6148 sampler_ci.maxAnisotropy = 1;
6149 sampler_ci.compareEnable = VK_FALSE;
6150 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6151 sampler_ci.minLod = 1.0;
6152 sampler_ci.maxLod = 1.0;
6153 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6154 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6155 VkSampler sampler;
6156 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6157 ASSERT_VK_SUCCESS(err);
6158 // Update descriptor with image and sampler
6159 VkDescriptorImageInfo img_info = {};
6160 img_info.sampler = sampler;
6161 img_info.imageView = view;
6162 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6163
6164 VkWriteDescriptorSet descriptor_write;
6165 memset(&descriptor_write, 0, sizeof(descriptor_write));
6166 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6167 descriptor_write.dstSet = descriptor_set;
6168 descriptor_write.dstBinding = 0;
6169 descriptor_write.descriptorCount = 1;
6170 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6171 descriptor_write.pImageInfo = &img_info;
6172
6173 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6174
6175 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006176 char const *vsSource =
6177 "#version 450\n"
6178 "\n"
6179 "out gl_PerVertex { \n"
6180 " vec4 gl_Position;\n"
6181 "};\n"
6182 "void main(){\n"
6183 " gl_Position = vec4(1);\n"
6184 "}\n";
6185 char const *fsSource =
6186 "#version 450\n"
6187 "\n"
6188 "layout(set=0, binding=0) uniform sampler2D s;\n"
6189 "layout(location=0) out vec4 x;\n"
6190 "void main(){\n"
6191 " x = texture(s, vec2(1));\n"
6192 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006193 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6194 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6195 VkPipelineObj pipe(m_device);
6196 pipe.AddShader(&vs);
6197 pipe.AddShader(&fs);
6198 pipe.AddColorAttachment();
6199 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6200
Tony Barbour552f6c02016-12-21 14:34:07 -07006201 m_commandBuffer->BeginCommandBuffer();
6202 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006203 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6204 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6205 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006206
6207 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6208 VkRect2D scissor = {{0, 0}, {16, 16}};
6209 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6210 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6211
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006212 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006213 m_commandBuffer->EndRenderPass();
6214 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006215 // Submit cmd buffer to put pool in-flight
6216 VkSubmitInfo submit_info = {};
6217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6218 submit_info.commandBufferCount = 1;
6219 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6221 // Destroy pool while in-flight, causing error
6222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6223 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6224 m_errorMonitor->VerifyFound();
6225 vkQueueWaitIdle(m_device->m_queue);
6226 // Cleanup
6227 vkDestroySampler(m_device->device(), sampler, NULL);
6228 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6229 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006230 m_errorMonitor->SetUnexpectedError(
6231 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6232 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006233 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006234 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006235}
6236
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006237TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6238 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006239 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006240 ASSERT_NO_FATAL_FAILURE(InitViewport());
6241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6242
6243 VkDescriptorPoolSize ds_type_count = {};
6244 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6245 ds_type_count.descriptorCount = 1;
6246
6247 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6248 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6249 ds_pool_ci.pNext = NULL;
6250 ds_pool_ci.maxSets = 1;
6251 ds_pool_ci.poolSizeCount = 1;
6252 ds_pool_ci.pPoolSizes = &ds_type_count;
6253
6254 VkDescriptorPool ds_pool;
6255 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6256 ASSERT_VK_SUCCESS(err);
6257
6258 VkDescriptorSetLayoutBinding dsl_binding = {};
6259 dsl_binding.binding = 0;
6260 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6261 dsl_binding.descriptorCount = 1;
6262 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6263 dsl_binding.pImmutableSamplers = NULL;
6264
6265 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6266 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6267 ds_layout_ci.pNext = NULL;
6268 ds_layout_ci.bindingCount = 1;
6269 ds_layout_ci.pBindings = &dsl_binding;
6270 VkDescriptorSetLayout ds_layout;
6271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6272 ASSERT_VK_SUCCESS(err);
6273
6274 VkDescriptorSet descriptorSet;
6275 VkDescriptorSetAllocateInfo alloc_info = {};
6276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6277 alloc_info.descriptorSetCount = 1;
6278 alloc_info.descriptorPool = ds_pool;
6279 alloc_info.pSetLayouts = &ds_layout;
6280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6281 ASSERT_VK_SUCCESS(err);
6282
6283 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6284 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6285 pipeline_layout_ci.pNext = NULL;
6286 pipeline_layout_ci.setLayoutCount = 1;
6287 pipeline_layout_ci.pSetLayouts = &ds_layout;
6288
6289 VkPipelineLayout pipeline_layout;
6290 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6291 ASSERT_VK_SUCCESS(err);
6292
6293 // Create images to update the descriptor with
6294 VkImage image;
6295 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6296 const int32_t tex_width = 32;
6297 const int32_t tex_height = 32;
6298 VkImageCreateInfo image_create_info = {};
6299 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6300 image_create_info.pNext = NULL;
6301 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6302 image_create_info.format = tex_format;
6303 image_create_info.extent.width = tex_width;
6304 image_create_info.extent.height = tex_height;
6305 image_create_info.extent.depth = 1;
6306 image_create_info.mipLevels = 1;
6307 image_create_info.arrayLayers = 1;
6308 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6309 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6310 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6311 image_create_info.flags = 0;
6312 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6313 ASSERT_VK_SUCCESS(err);
6314 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6315 VkMemoryRequirements memory_reqs;
6316 VkDeviceMemory image_memory;
6317 bool pass;
6318 VkMemoryAllocateInfo memory_info = {};
6319 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6320 memory_info.pNext = NULL;
6321 memory_info.allocationSize = 0;
6322 memory_info.memoryTypeIndex = 0;
6323 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6324 // Allocate enough memory for image
6325 memory_info.allocationSize = memory_reqs.size;
6326 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6327 ASSERT_TRUE(pass);
6328 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6329 ASSERT_VK_SUCCESS(err);
6330 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6331 ASSERT_VK_SUCCESS(err);
6332
6333 VkImageViewCreateInfo image_view_create_info = {};
6334 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6335 image_view_create_info.image = image;
6336 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6337 image_view_create_info.format = tex_format;
6338 image_view_create_info.subresourceRange.layerCount = 1;
6339 image_view_create_info.subresourceRange.baseMipLevel = 0;
6340 image_view_create_info.subresourceRange.levelCount = 1;
6341 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6342
6343 VkImageView view;
6344 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6345 ASSERT_VK_SUCCESS(err);
6346 // Create Samplers
6347 VkSamplerCreateInfo sampler_ci = {};
6348 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6349 sampler_ci.pNext = NULL;
6350 sampler_ci.magFilter = VK_FILTER_NEAREST;
6351 sampler_ci.minFilter = VK_FILTER_NEAREST;
6352 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6353 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6354 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6355 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6356 sampler_ci.mipLodBias = 1.0;
6357 sampler_ci.anisotropyEnable = VK_FALSE;
6358 sampler_ci.maxAnisotropy = 1;
6359 sampler_ci.compareEnable = VK_FALSE;
6360 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6361 sampler_ci.minLod = 1.0;
6362 sampler_ci.maxLod = 1.0;
6363 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6364 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6365 VkSampler sampler;
6366 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6367 ASSERT_VK_SUCCESS(err);
6368 // Update descriptor with image and sampler
6369 VkDescriptorImageInfo img_info = {};
6370 img_info.sampler = sampler;
6371 img_info.imageView = view;
6372 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6373
6374 VkWriteDescriptorSet descriptor_write;
6375 memset(&descriptor_write, 0, sizeof(descriptor_write));
6376 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6377 descriptor_write.dstSet = descriptorSet;
6378 descriptor_write.dstBinding = 0;
6379 descriptor_write.descriptorCount = 1;
6380 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6381 descriptor_write.pImageInfo = &img_info;
6382 // Break memory binding and attempt update
6383 vkFreeMemory(m_device->device(), image_memory, nullptr);
6384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006385 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6387 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6388 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6389 m_errorMonitor->VerifyFound();
6390 // Cleanup
6391 vkDestroyImage(m_device->device(), image, NULL);
6392 vkDestroySampler(m_device->device(), sampler, NULL);
6393 vkDestroyImageView(m_device->device(), view, NULL);
6394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6397}
6398
Karl Schultz6addd812016-02-02 17:17:23 -07006399TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006400 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6401 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006402 // Create a valid cmd buffer
6403 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006404 uint64_t fake_pipeline_handle = 0xbaad6001;
6405 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006406 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6408
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006410 m_commandBuffer->BeginCommandBuffer();
6411 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006413 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006414
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006415 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006416 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 -06006417 Draw(1, 0, 0, 0);
6418 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006419
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006420 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006421 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 -07006422 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006423 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6424 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006425}
6426
Karl Schultz6addd812016-02-02 17:17:23 -07006427TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006428 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006429 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006432
Tony Barbour1fa09702017-03-16 12:09:08 -06006433 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006434 ASSERT_NO_FATAL_FAILURE(InitViewport());
6435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006436 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006437 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6438 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006439
6440 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006441 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6442 ds_pool_ci.pNext = NULL;
6443 ds_pool_ci.maxSets = 1;
6444 ds_pool_ci.poolSizeCount = 1;
6445 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006446
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006447 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006448 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006449 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006450
Tony Barboureb254902015-07-15 12:50:33 -06006451 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006452 dsl_binding.binding = 0;
6453 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6454 dsl_binding.descriptorCount = 1;
6455 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6456 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006457
Tony Barboureb254902015-07-15 12:50:33 -06006458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6460 ds_layout_ci.pNext = NULL;
6461 ds_layout_ci.bindingCount = 1;
6462 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006463 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006464 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006465 ASSERT_VK_SUCCESS(err);
6466
6467 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006468 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006469 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006470 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006471 alloc_info.descriptorPool = ds_pool;
6472 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006473 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006474 ASSERT_VK_SUCCESS(err);
6475
Tony Barboureb254902015-07-15 12:50:33 -06006476 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006477 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6478 pipeline_layout_ci.pNext = NULL;
6479 pipeline_layout_ci.setLayoutCount = 1;
6480 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006481
6482 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006483 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006484 ASSERT_VK_SUCCESS(err);
6485
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006486 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006487 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006488 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006489 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006490
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006491 VkPipelineObj pipe(m_device);
6492 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006493 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006494 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006495 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006496
Tony Barbour552f6c02016-12-21 14:34:07 -07006497 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006498 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6499 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6500 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006501
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006502 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006503
Chia-I Wuf7458c52015-10-26 21:10:41 +08006504 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6505 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6506 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006507}
6508
Karl Schultz6addd812016-02-02 17:17:23 -07006509TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006510 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006511 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006514
Tony Barbour1fa09702017-03-16 12:09:08 -06006515 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006516 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006517 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6518 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006519
6520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6522 ds_pool_ci.pNext = NULL;
6523 ds_pool_ci.maxSets = 1;
6524 ds_pool_ci.poolSizeCount = 1;
6525 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006526
6527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006529 ASSERT_VK_SUCCESS(err);
6530
6531 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006532 dsl_binding.binding = 0;
6533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6534 dsl_binding.descriptorCount = 1;
6535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6536 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006537
6538 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006539 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6540 ds_layout_ci.pNext = NULL;
6541 ds_layout_ci.bindingCount = 1;
6542 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006543 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006544 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006545 ASSERT_VK_SUCCESS(err);
6546
6547 VkDescriptorSet descriptorSet;
6548 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006549 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006550 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006551 alloc_info.descriptorPool = ds_pool;
6552 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006553 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006554 ASSERT_VK_SUCCESS(err);
6555
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006556 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006557 VkWriteDescriptorSet descriptor_write;
6558 memset(&descriptor_write, 0, sizeof(descriptor_write));
6559 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6560 descriptor_write.dstSet = descriptorSet;
6561 descriptor_write.dstBinding = 0;
6562 descriptor_write.descriptorCount = 1;
6563 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6564 descriptor_write.pTexelBufferView = &view;
6565
6566 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6567
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006568 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006569
6570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6571 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6572}
6573
Mark Youngd339ba32016-05-30 13:28:35 -06006574TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006575 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 -06006576
6577 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006579 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006580
Tony Barbour1fa09702017-03-16 12:09:08 -06006581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006582
6583 // Create a buffer with no bound memory and then attempt to create
6584 // a buffer view.
6585 VkBufferCreateInfo buff_ci = {};
6586 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006587 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006588 buff_ci.size = 256;
6589 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6590 VkBuffer buffer;
6591 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6592 ASSERT_VK_SUCCESS(err);
6593
6594 VkBufferViewCreateInfo buff_view_ci = {};
6595 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6596 buff_view_ci.buffer = buffer;
6597 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6598 buff_view_ci.range = VK_WHOLE_SIZE;
6599 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006600 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006601
6602 m_errorMonitor->VerifyFound();
6603 vkDestroyBuffer(m_device->device(), buffer, NULL);
6604 // If last error is success, it still created the view, so delete it.
6605 if (err == VK_SUCCESS) {
6606 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6607 }
6608}
6609
Karl Schultz6addd812016-02-02 17:17:23 -07006610TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6611 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6612 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006613 // 1. No dynamicOffset supplied
6614 // 2. Too many dynamicOffsets supplied
6615 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006616 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6618 " requires 1 dynamicOffsets, but only "
6619 "0 dynamicOffsets are left in "
6620 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006621
Tony Barbour1fa09702017-03-16 12:09:08 -06006622 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623 ASSERT_NO_FATAL_FAILURE(InitViewport());
6624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6625
6626 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6628 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006629
6630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6632 ds_pool_ci.pNext = NULL;
6633 ds_pool_ci.maxSets = 1;
6634 ds_pool_ci.poolSizeCount = 1;
6635 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006636
6637 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006639 ASSERT_VK_SUCCESS(err);
6640
6641 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006642 dsl_binding.binding = 0;
6643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6644 dsl_binding.descriptorCount = 1;
6645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6646 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006647
6648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6650 ds_layout_ci.pNext = NULL;
6651 ds_layout_ci.bindingCount = 1;
6652 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006653 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006654 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006655 ASSERT_VK_SUCCESS(err);
6656
6657 VkDescriptorSet descriptorSet;
6658 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006659 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006660 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006661 alloc_info.descriptorPool = ds_pool;
6662 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006663 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006664 ASSERT_VK_SUCCESS(err);
6665
6666 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6668 pipeline_layout_ci.pNext = NULL;
6669 pipeline_layout_ci.setLayoutCount = 1;
6670 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006671
6672 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006673 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006674 ASSERT_VK_SUCCESS(err);
6675
6676 // Create a buffer to update the descriptor with
6677 uint32_t qfi = 0;
6678 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006679 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6680 buffCI.size = 1024;
6681 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6682 buffCI.queueFamilyIndexCount = 1;
6683 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006684
6685 VkBuffer dyub;
6686 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6687 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006688 // Allocate memory and bind to buffer so we can make it to the appropriate
6689 // error
6690 VkMemoryAllocateInfo mem_alloc = {};
6691 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6692 mem_alloc.pNext = NULL;
6693 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006694 mem_alloc.memoryTypeIndex = 0;
6695
6696 VkMemoryRequirements memReqs;
6697 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006699 if (!pass) {
6700 vkDestroyBuffer(m_device->device(), dyub, NULL);
6701 return;
6702 }
6703
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006704 VkDeviceMemory mem;
6705 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6706 ASSERT_VK_SUCCESS(err);
6707 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6708 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006709 // Correctly update descriptor to avoid "NOT_UPDATED" error
6710 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006711 buffInfo.buffer = dyub;
6712 buffInfo.offset = 0;
6713 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006714
6715 VkWriteDescriptorSet descriptor_write;
6716 memset(&descriptor_write, 0, sizeof(descriptor_write));
6717 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6718 descriptor_write.dstSet = descriptorSet;
6719 descriptor_write.dstBinding = 0;
6720 descriptor_write.descriptorCount = 1;
6721 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6722 descriptor_write.pBufferInfo = &buffInfo;
6723
6724 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6725
Tony Barbour552f6c02016-12-21 14:34:07 -07006726 m_commandBuffer->BeginCommandBuffer();
6727 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006728 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6729 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006730 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006731 uint32_t pDynOff[2] = {512, 756};
6732 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6734 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6735 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6736 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006737 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006738 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6740 " dynamic offset 512 combined with "
6741 "offset 0 and range 1024 that "
6742 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006743 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006744 char const *vsSource =
6745 "#version 450\n"
6746 "\n"
6747 "out gl_PerVertex { \n"
6748 " vec4 gl_Position;\n"
6749 "};\n"
6750 "void main(){\n"
6751 " gl_Position = vec4(1);\n"
6752 "}\n";
6753 char const *fsSource =
6754 "#version 450\n"
6755 "\n"
6756 "layout(location=0) out vec4 x;\n"
6757 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6758 "void main(){\n"
6759 " x = vec4(bar.y);\n"
6760 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6763 VkPipelineObj pipe(m_device);
6764 pipe.AddShader(&vs);
6765 pipe.AddShader(&fs);
6766 pipe.AddColorAttachment();
6767 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6768
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006769 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6770 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6771 VkRect2D scissor = {{0, 0}, {16, 16}};
6772 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006774 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006775 // This update should succeed, but offset size of 512 will overstep buffer
6776 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006777 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6778 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006779 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006780 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006781
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006782 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006783 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006784
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006785 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006786 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006787 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6788}
6789
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006790TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006791 TEST_DESCRIPTION(
6792 "Attempt to update a descriptor with a non-sparse buffer "
6793 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006794 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006796 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006799
Tony Barbour1fa09702017-03-16 12:09:08 -06006800 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006801 ASSERT_NO_FATAL_FAILURE(InitViewport());
6802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6803
6804 VkDescriptorPoolSize ds_type_count = {};
6805 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6806 ds_type_count.descriptorCount = 1;
6807
6808 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6809 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6810 ds_pool_ci.pNext = NULL;
6811 ds_pool_ci.maxSets = 1;
6812 ds_pool_ci.poolSizeCount = 1;
6813 ds_pool_ci.pPoolSizes = &ds_type_count;
6814
6815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006816 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006817 ASSERT_VK_SUCCESS(err);
6818
6819 VkDescriptorSetLayoutBinding dsl_binding = {};
6820 dsl_binding.binding = 0;
6821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6822 dsl_binding.descriptorCount = 1;
6823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6824 dsl_binding.pImmutableSamplers = NULL;
6825
6826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6828 ds_layout_ci.pNext = NULL;
6829 ds_layout_ci.bindingCount = 1;
6830 ds_layout_ci.pBindings = &dsl_binding;
6831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006833 ASSERT_VK_SUCCESS(err);
6834
6835 VkDescriptorSet descriptorSet;
6836 VkDescriptorSetAllocateInfo alloc_info = {};
6837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6838 alloc_info.descriptorSetCount = 1;
6839 alloc_info.descriptorPool = ds_pool;
6840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006842 ASSERT_VK_SUCCESS(err);
6843
6844 // Create a buffer to update the descriptor with
6845 uint32_t qfi = 0;
6846 VkBufferCreateInfo buffCI = {};
6847 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6848 buffCI.size = 1024;
6849 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6850 buffCI.queueFamilyIndexCount = 1;
6851 buffCI.pQueueFamilyIndices = &qfi;
6852
6853 VkBuffer dyub;
6854 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6855 ASSERT_VK_SUCCESS(err);
6856
6857 // Attempt to update descriptor without binding memory to it
6858 VkDescriptorBufferInfo buffInfo = {};
6859 buffInfo.buffer = dyub;
6860 buffInfo.offset = 0;
6861 buffInfo.range = 1024;
6862
6863 VkWriteDescriptorSet descriptor_write;
6864 memset(&descriptor_write, 0, sizeof(descriptor_write));
6865 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6866 descriptor_write.dstSet = descriptorSet;
6867 descriptor_write.dstBinding = 0;
6868 descriptor_write.descriptorCount = 1;
6869 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6870 descriptor_write.pBufferInfo = &buffInfo;
6871
6872 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6873 m_errorMonitor->VerifyFound();
6874
6875 vkDestroyBuffer(m_device->device(), dyub, NULL);
6876 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6877 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6878}
6879
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006880TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006881 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006882 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006883 ASSERT_NO_FATAL_FAILURE(InitViewport());
6884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6885
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006886 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006887 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006888 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6889 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6890 pipeline_layout_ci.pushConstantRangeCount = 1;
6891 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6892
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006893 //
6894 // Check for invalid push constant ranges in pipeline layouts.
6895 //
6896 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006897 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006898 char const *msg;
6899 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006900
Karl Schultzc81037d2016-05-12 08:11:23 -06006901 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6902 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6903 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6904 "vkCreatePipelineLayout() call has push constants index 0 with "
6905 "size 0."},
6906 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6907 "vkCreatePipelineLayout() call has push constants index 0 with "
6908 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006909 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006910 "vkCreatePipelineLayout() call has push constants index 0 with "
6911 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006912 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006913 "vkCreatePipelineLayout() call has push constants index 0 with "
6914 "size 0."},
6915 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6916 "vkCreatePipelineLayout() call has push constants index 0 with "
6917 "offset 1. Offset must"},
6918 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6919 "vkCreatePipelineLayout() call has push constants index 0 "
6920 "with offset "},
6921 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6922 "vkCreatePipelineLayout() call has push constants "
6923 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006924 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006925 "vkCreatePipelineLayout() call has push constants index 0 "
6926 "with offset "},
6927 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6928 "vkCreatePipelineLayout() call has push "
6929 "constants index 0 with offset "},
6930 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6931 "vkCreatePipelineLayout() call has push "
6932 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006933 }};
6934
6935 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006936 for (const auto &iter : range_tests) {
6937 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6939 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006940 m_errorMonitor->VerifyFound();
6941 if (VK_SUCCESS == err) {
6942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6943 }
6944 }
6945
6946 // Check for invalid stage flag
6947 pc_range.offset = 0;
6948 pc_range.size = 16;
6949 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006950 m_errorMonitor->SetDesiredFailureMsg(
6951 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6952 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006954 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006955 if (VK_SUCCESS == err) {
6956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6957 }
6958
Karl Schultzc59b72d2017-02-24 15:45:05 -07006959 // Check for duplicate stage flags in a list of push constant ranges.
6960 // A shader can only have one push constant block and that block is mapped
6961 // to the push constant range that has that shader's stage flag set.
6962 // The shader's stage flag can only appear once in all the ranges, so the
6963 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006964 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006965 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006966 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006967 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006968 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006969 // Overlapping ranges are OK, but a stage flag can appear only once.
6970 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6971 {
6972 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6973 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6974 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6975 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006976 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006977 {
6978 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6979 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6980 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6981 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6982 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6983 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6984 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6985 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6986 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6987 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6988 }},
6989 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6990 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6991 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6992 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6993 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6994 {
6995 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6996 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6997 }},
6998 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6999 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7000 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7001 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7002 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7003 {
7004 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7005 }},
7006 },
7007 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007008
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007010 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007011 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007013 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007014 m_errorMonitor->VerifyFound();
7015 if (VK_SUCCESS == err) {
7016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7017 }
7018 }
7019
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007020 //
7021 // CmdPushConstants tests
7022 //
7023
Karl Schultzc59b72d2017-02-24 15:45:05 -07007024 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007025 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007026 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007027 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007028 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007029 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007030 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007032
7033 const uint8_t dummy_values[100] = {};
7034
7035 m_commandBuffer->BeginCommandBuffer();
7036 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007037
7038 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007039 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007041 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007042 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043
Karl Schultzc59b72d2017-02-24 15:45:05 -07007044 m_errorMonitor->ExpectSuccess();
7045 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7046 m_errorMonitor->VerifyNotFound();
7047 m_errorMonitor->ExpectSuccess();
7048 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7049 m_errorMonitor->VerifyNotFound();
7050 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7051 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7052 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7053 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7054 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7055 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7056 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007057 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007058 for (const auto &iter : cmd_range_tests) {
7059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7060 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7061 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007062 m_errorMonitor->VerifyFound();
7063 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007064
Tony Barbour552f6c02016-12-21 14:34:07 -07007065 m_commandBuffer->EndRenderPass();
7066 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007067 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007068}
7069
Karl Schultz6addd812016-02-02 17:17:23 -07007070TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007071 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007072 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007073
Tony Barbour1fa09702017-03-16 12:09:08 -06007074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007075 ASSERT_NO_FATAL_FAILURE(InitViewport());
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
7078 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7079 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007080 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7081 ds_type_count[0].descriptorCount = 10;
7082 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7083 ds_type_count[1].descriptorCount = 2;
7084 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7085 ds_type_count[2].descriptorCount = 2;
7086 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7087 ds_type_count[3].descriptorCount = 5;
7088 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7089 // type
7090 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7091 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7092 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007093
7094 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007095 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7096 ds_pool_ci.pNext = NULL;
7097 ds_pool_ci.maxSets = 5;
7098 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7099 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007100
7101 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007102 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007103 ASSERT_VK_SUCCESS(err);
7104
7105 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7106 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007107 dsl_binding[0].binding = 0;
7108 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7109 dsl_binding[0].descriptorCount = 5;
7110 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7111 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007112
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007113 // Create layout identical to set0 layout but w/ different stageFlags
7114 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007115 dsl_fs_stage_only.binding = 0;
7116 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7117 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007118 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7119 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007120 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007122 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7123 ds_layout_ci.pNext = NULL;
7124 ds_layout_ci.bindingCount = 1;
7125 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007126 static const uint32_t NUM_LAYOUTS = 4;
7127 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007128 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007129 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7130 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007131 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007132 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007133 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007135 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007136 dsl_binding[0].binding = 0;
7137 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007139 dsl_binding[1].binding = 1;
7140 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7141 dsl_binding[1].descriptorCount = 2;
7142 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7143 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007144 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007145 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007147 ASSERT_VK_SUCCESS(err);
7148 dsl_binding[0].binding = 0;
7149 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007150 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007151 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007153 ASSERT_VK_SUCCESS(err);
7154 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007155 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007156 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007157 ASSERT_VK_SUCCESS(err);
7158
7159 static const uint32_t NUM_SETS = 4;
7160 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7161 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007162 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007163 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007164 alloc_info.descriptorPool = ds_pool;
7165 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007167 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007168 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007169 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007170 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007172 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007173
7174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7176 pipeline_layout_ci.pNext = NULL;
7177 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7178 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007179
7180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007182 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007183 // Create pipelineLayout with only one setLayout
7184 pipeline_layout_ci.setLayoutCount = 1;
7185 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007186 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007187 ASSERT_VK_SUCCESS(err);
7188 // Create pipelineLayout with 2 descriptor setLayout at index 0
7189 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7190 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007192 ASSERT_VK_SUCCESS(err);
7193 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7194 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7195 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007197 ASSERT_VK_SUCCESS(err);
7198 // Create pipelineLayout with UB type, but stageFlags for FS only
7199 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7200 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007201 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007202 ASSERT_VK_SUCCESS(err);
7203 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7204 VkDescriptorSetLayout pl_bad_s0[2] = {};
7205 pl_bad_s0[0] = ds_layout_fs_only;
7206 pl_bad_s0[1] = ds_layout[1];
7207 pipeline_layout_ci.setLayoutCount = 2;
7208 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7209 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007210 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007211 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007212
Tobin Ehlis88452832015-12-03 09:40:56 -07007213 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007214 char const *vsSource =
7215 "#version 450\n"
7216 "\n"
7217 "out gl_PerVertex {\n"
7218 " vec4 gl_Position;\n"
7219 "};\n"
7220 "void main(){\n"
7221 " gl_Position = vec4(1);\n"
7222 "}\n";
7223 char const *fsSource =
7224 "#version 450\n"
7225 "\n"
7226 "layout(location=0) out vec4 x;\n"
7227 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7228 "void main(){\n"
7229 " x = vec4(bar.y);\n"
7230 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007233 VkPipelineObj pipe(m_device);
7234 pipe.AddShader(&vs);
7235 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007236 pipe.AddColorAttachment();
7237 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007238
Tony Barbour552f6c02016-12-21 14:34:07 -07007239 m_commandBuffer->BeginCommandBuffer();
7240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007242 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007243 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7244 // of PSO
7245 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7246 // cmd_pipeline.c
7247 // due to the fact that cmd_alloc_dset_data() has not been called in
7248 // cmd_bind_graphics_pipeline()
7249 // TODO : Want to cause various binding incompatibility issues here to test
7250 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007251 // First cause various verify_layout_compatibility() fails
7252 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007253 // verify_set_layout_compatibility fail cases:
7254 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007256 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7257 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007258 m_errorMonitor->VerifyFound();
7259
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007260 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7262 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7263 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007264 m_errorMonitor->VerifyFound();
7265
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007266 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007267 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7268 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7270 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7271 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007272 m_errorMonitor->VerifyFound();
7273
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007274 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7275 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7277 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7278 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007279 m_errorMonitor->VerifyFound();
7280
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007281 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7282 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7284 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7286 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007287 m_errorMonitor->VerifyFound();
7288
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007289 // Cause INFO messages due to disturbing previously bound Sets
7290 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7292 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007293 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7295 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7296 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007297 m_errorMonitor->VerifyFound();
7298
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007299 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7300 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007301 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7303 " newly bound as set #0 so set #1 and "
7304 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007305 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7306 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007307 m_errorMonitor->VerifyFound();
7308
Tobin Ehlis10fad692016-07-07 12:00:36 -06007309 // Now that we're done actively using the pipelineLayout that gfx pipeline
7310 // was created with, we should be able to delete it. Do that now to verify
7311 // that validation obeys pipelineLayout lifetime
7312 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7313
Tobin Ehlis88452832015-12-03 09:40:56 -07007314 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // 1. Error due to not binding required set (we actually use same code as
7316 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7318 &descriptorSet[0], 0, NULL);
7319 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7320 &descriptorSet[1], 0, NULL);
7321 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 -07007322
7323 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7324 VkRect2D scissor = {{0, 0}, {16, 16}};
7325 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7326 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7327
Tobin Ehlis88452832015-12-03 09:40:56 -07007328 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007329 m_errorMonitor->VerifyFound();
7330
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007331 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007332 // 2. Error due to bound set not being compatible with PSO's
7333 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007334 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7335 &descriptorSet[0], 0, NULL);
7336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007337 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007338 m_errorMonitor->VerifyFound();
7339
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007340 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007341 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7343 }
7344 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7346 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7347}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007348
Karl Schultz6addd812016-02-02 17:17:23 -07007349TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7351 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007352
Tony Barbour1fa09702017-03-16 12:09:08 -06007353 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007354 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007355 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007357
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007358 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007359}
7360
Karl Schultz6addd812016-02-02 17:17:23 -07007361TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7362 VkResult err;
7363 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007364
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007366
Tony Barbour1fa09702017-03-16 12:09:08 -06007367 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007368
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007369 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007370 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007371 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007372 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007373 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007374 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007375
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007376 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007377 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007378
7379 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007380 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007381 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7382
7383 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007384 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007385 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007386 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 -07007387 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007388
7389 // The error should be caught by validation of the BeginCommandBuffer call
7390 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007392 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007393 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007394}
7395
Karl Schultz6addd812016-02-02 17:17:23 -07007396TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007397 // Cause error due to Begin while recording CB
7398 // Then cause 2 errors for attempting to reset CB w/o having
7399 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7400 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007402
Tony Barbour1fa09702017-03-16 12:09:08 -06007403 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007404
7405 // Calls AllocateCommandBuffers
7406 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7407
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007408 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007409 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007410 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7411 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007412 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7413 cmd_buf_info.pNext = NULL;
7414 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007415 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007416
7417 // Begin CB to transition to recording state
7418 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7419 // Can't re-begin. This should trigger error
7420 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007421 m_errorMonitor->VerifyFound();
7422
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007424 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007425 // Reset attempt will trigger error due to incorrect CommandPool state
7426 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007427 m_errorMonitor->VerifyFound();
7428
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007430 // Transition CB to RECORDED state
7431 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7432 // Now attempting to Begin will implicitly reset, which triggers error
7433 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007434 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007435}
7436
Karl Schultz6addd812016-02-02 17:17:23 -07007437TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007438 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007439 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7442 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007443
Tony Barbour1fa09702017-03-16 12:09:08 -06007444 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007446
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007447 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007448 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7449 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007450
7451 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007452 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7453 ds_pool_ci.pNext = NULL;
7454 ds_pool_ci.maxSets = 1;
7455 ds_pool_ci.poolSizeCount = 1;
7456 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007457
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007458 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007459 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007460 ASSERT_VK_SUCCESS(err);
7461
Tony Barboureb254902015-07-15 12:50:33 -06007462 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007463 dsl_binding.binding = 0;
7464 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7465 dsl_binding.descriptorCount = 1;
7466 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7467 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007468
Tony Barboureb254902015-07-15 12:50:33 -06007469 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007470 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7471 ds_layout_ci.pNext = NULL;
7472 ds_layout_ci.bindingCount = 1;
7473 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007474
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007475 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007477 ASSERT_VK_SUCCESS(err);
7478
7479 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007480 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007481 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007482 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007483 alloc_info.descriptorPool = ds_pool;
7484 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007486 ASSERT_VK_SUCCESS(err);
7487
Tony Barboureb254902015-07-15 12:50:33 -06007488 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007489 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7490 pipeline_layout_ci.setLayoutCount = 1;
7491 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007492
7493 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007494 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007495 ASSERT_VK_SUCCESS(err);
7496
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007497 VkViewport vp = {}; // Just need dummy vp to point to
7498 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007499
7500 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007501 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7502 vp_state_ci.scissorCount = 1;
7503 vp_state_ci.pScissors = &sc;
7504 vp_state_ci.viewportCount = 1;
7505 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007506
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007507 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7508 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7509 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7510 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7511 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7512 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007513 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007514 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007515 rs_state_ci.lineWidth = 1.0f;
7516
7517 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7518 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7519 vi_ci.pNext = nullptr;
7520 vi_ci.vertexBindingDescriptionCount = 0;
7521 vi_ci.pVertexBindingDescriptions = nullptr;
7522 vi_ci.vertexAttributeDescriptionCount = 0;
7523 vi_ci.pVertexAttributeDescriptions = nullptr;
7524
7525 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7526 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7527 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7528
7529 VkPipelineShaderStageCreateInfo shaderStages[2];
7530 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7531
7532 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7533 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007534 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007535 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007536
Tony Barboureb254902015-07-15 12:50:33 -06007537 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007538 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7539 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007540 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007541 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7542 gp_ci.layout = pipeline_layout;
7543 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007544 gp_ci.pVertexInputState = &vi_ci;
7545 gp_ci.pInputAssemblyState = &ia_ci;
7546
7547 gp_ci.stageCount = 1;
7548 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007549
7550 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007551 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7552 pc_ci.initialDataSize = 0;
7553 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007554
7555 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007556 VkPipelineCache pipelineCache;
7557
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007558 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007559 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007560 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007561 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007562
Chia-I Wuf7458c52015-10-26 21:10:41 +08007563 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7564 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7565 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7566 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007567}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007568
Tobin Ehlis912df022015-09-17 08:46:18 -06007569/*// TODO : This test should be good, but needs Tess support in compiler to run
7570TEST_F(VkLayerTest, InvalidPatchControlPoints)
7571{
7572 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007573 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007574
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007576 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7577primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007578
Tony Barbour1fa09702017-03-16 12:09:08 -06007579 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007581
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007582 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007583 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007584 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007585
7586 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7587 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7588 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007589 ds_pool_ci.poolSizeCount = 1;
7590 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007591
7592 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007593 err = vkCreateDescriptorPool(m_device->device(),
7594VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 ASSERT_VK_SUCCESS(err);
7596
7597 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007598 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007599 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007600 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7602 dsl_binding.pImmutableSamplers = NULL;
7603
7604 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007605 ds_layout_ci.sType =
7606VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007607 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007608 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007609 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007610
7611 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007612 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7613&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007614 ASSERT_VK_SUCCESS(err);
7615
7616 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007617 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7618VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007619 ASSERT_VK_SUCCESS(err);
7620
7621 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007622 pipeline_layout_ci.sType =
7623VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007624 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007625 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007626 pipeline_layout_ci.pSetLayouts = &ds_layout;
7627
7628 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007629 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7630&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007631 ASSERT_VK_SUCCESS(err);
7632
7633 VkPipelineShaderStageCreateInfo shaderStages[3];
7634 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7635
Karl Schultz6addd812016-02-02 17:17:23 -07007636 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7637this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007638 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007639 VkShaderObj
7640tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7641this);
7642 VkShaderObj
7643te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7644this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007645
Karl Schultz6addd812016-02-02 17:17:23 -07007646 shaderStages[0].sType =
7647VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007648 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007649 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007650 shaderStages[1].sType =
7651VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007652 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007653 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007654 shaderStages[2].sType =
7655VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007656 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007657 shaderStages[2].shader = te.handle();
7658
7659 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007660 iaCI.sType =
7661VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007662 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007663
7664 VkPipelineTessellationStateCreateInfo tsCI = {};
7665 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7666 tsCI.patchControlPoints = 0; // This will cause an error
7667
7668 VkGraphicsPipelineCreateInfo gp_ci = {};
7669 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7670 gp_ci.pNext = NULL;
7671 gp_ci.stageCount = 3;
7672 gp_ci.pStages = shaderStages;
7673 gp_ci.pVertexInputState = NULL;
7674 gp_ci.pInputAssemblyState = &iaCI;
7675 gp_ci.pTessellationState = &tsCI;
7676 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007677 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007678 gp_ci.pMultisampleState = NULL;
7679 gp_ci.pDepthStencilState = NULL;
7680 gp_ci.pColorBlendState = NULL;
7681 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7682 gp_ci.layout = pipeline_layout;
7683 gp_ci.renderPass = renderPass();
7684
7685 VkPipelineCacheCreateInfo pc_ci = {};
7686 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7687 pc_ci.pNext = NULL;
7688 pc_ci.initialSize = 0;
7689 pc_ci.initialData = 0;
7690 pc_ci.maxSize = 0;
7691
7692 VkPipeline pipeline;
7693 VkPipelineCache pipelineCache;
7694
Karl Schultz6addd812016-02-02 17:17:23 -07007695 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7696&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007697 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007698 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7699&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007701 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007702
Chia-I Wuf7458c52015-10-26 21:10:41 +08007703 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007707}
7708*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007709
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007710TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007711 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007712
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007713 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007714
Tony Barbour1fa09702017-03-16 12:09:08 -06007715 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007717
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007718 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007719 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7720 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007721
7722 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007723 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7724 ds_pool_ci.maxSets = 1;
7725 ds_pool_ci.poolSizeCount = 1;
7726 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007727
7728 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007729 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730 ASSERT_VK_SUCCESS(err);
7731
7732 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007733 dsl_binding.binding = 0;
7734 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7735 dsl_binding.descriptorCount = 1;
7736 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737
7738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7740 ds_layout_ci.bindingCount = 1;
7741 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007742
7743 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007744 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007745 ASSERT_VK_SUCCESS(err);
7746
7747 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007748 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007749 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007750 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007751 alloc_info.descriptorPool = ds_pool;
7752 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007753 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007754 ASSERT_VK_SUCCESS(err);
7755
7756 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007757 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7758 pipeline_layout_ci.setLayoutCount = 1;
7759 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007760
7761 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007762 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007763 ASSERT_VK_SUCCESS(err);
7764
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007765 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007766 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007767 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007768 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007769 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007770 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007771
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007772 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7773 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7774 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7775 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7776 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7777 rs_state_ci.depthClampEnable = VK_FALSE;
7778 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7779 rs_state_ci.depthBiasEnable = VK_FALSE;
7780
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007781 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7782 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7783 vi_ci.pNext = nullptr;
7784 vi_ci.vertexBindingDescriptionCount = 0;
7785 vi_ci.pVertexBindingDescriptions = nullptr;
7786 vi_ci.vertexAttributeDescriptionCount = 0;
7787 vi_ci.pVertexAttributeDescriptions = nullptr;
7788
7789 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7790 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7791 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7792
7793 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7794 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7795 pipe_ms_state_ci.pNext = NULL;
7796 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7797 pipe_ms_state_ci.sampleShadingEnable = 0;
7798 pipe_ms_state_ci.minSampleShading = 1.0;
7799 pipe_ms_state_ci.pSampleMask = NULL;
7800
Cody Northropeb3a6c12015-10-05 14:44:45 -06007801 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007802 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007803
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007804 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007805 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007806 shaderStages[0] = vs.GetStageCreateInfo();
7807 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007808
7809 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7811 gp_ci.stageCount = 2;
7812 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007813 gp_ci.pVertexInputState = &vi_ci;
7814 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007816 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007817 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007818 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7819 gp_ci.layout = pipeline_layout;
7820 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007821
7822 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007823 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007824
7825 VkPipeline pipeline;
7826 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007827 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007828 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007829
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007830 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007831 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007832
7833 // Check case where multiViewport is disabled and viewport count is not 1
7834 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7837 vp_state_ci.scissorCount = 0;
7838 vp_state_ci.viewportCount = 0;
7839 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7840 m_errorMonitor->VerifyFound();
7841 } else {
7842 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007843 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007844 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007845 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007846
7847 // Check is that viewportcount and scissorcount match
7848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7849 vp_state_ci.scissorCount = 1;
7850 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7851 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7852 m_errorMonitor->VerifyFound();
7853
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007854 // Check case where multiViewport is enabled and viewport count is greater than max
7855 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7858 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7859 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7860 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7861 m_errorMonitor->VerifyFound();
7862 }
7863 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007864
Chia-I Wuf7458c52015-10-26 21:10:41 +08007865 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7866 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7868 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007869}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007870
7871// 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
7872// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007873TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007874 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007875
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007876 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7877
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007879
Tony Barbour1fa09702017-03-16 12:09:08 -06007880 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007882
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007883 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007884 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7885 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007886
7887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7889 ds_pool_ci.maxSets = 1;
7890 ds_pool_ci.poolSizeCount = 1;
7891 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
7893 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007894 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007898 dsl_binding.binding = 0;
7899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7900 dsl_binding.descriptorCount = 1;
7901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902
7903 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007904 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7905 ds_layout_ci.bindingCount = 1;
7906 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 ASSERT_VK_SUCCESS(err);
7911
7912 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007913 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007914 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007915 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007916 alloc_info.descriptorPool = ds_pool;
7917 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007918 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919 ASSERT_VK_SUCCESS(err);
7920
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007921 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7922 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7923 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7924
7925 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7926 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7927 vi_ci.pNext = nullptr;
7928 vi_ci.vertexBindingDescriptionCount = 0;
7929 vi_ci.pVertexBindingDescriptions = nullptr;
7930 vi_ci.vertexAttributeDescriptionCount = 0;
7931 vi_ci.pVertexAttributeDescriptions = nullptr;
7932
7933 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7934 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7935 pipe_ms_state_ci.pNext = NULL;
7936 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7937 pipe_ms_state_ci.sampleShadingEnable = 0;
7938 pipe_ms_state_ci.minSampleShading = 1.0;
7939 pipe_ms_state_ci.pSampleMask = NULL;
7940
Tobin Ehlise68360f2015-10-01 11:15:13 -06007941 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007942 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7943 pipeline_layout_ci.setLayoutCount = 1;
7944 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945
7946 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007947 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007948 ASSERT_VK_SUCCESS(err);
7949
7950 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7951 // Set scissor as dynamic to avoid second error
7952 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7954 dyn_state_ci.dynamicStateCount = 1;
7955 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007956
Cody Northropeb3a6c12015-10-05 14:44:45 -06007957 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007958 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007960 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007961 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7962 // 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 +08007963 shaderStages[0] = vs.GetStageCreateInfo();
7964 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007965
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007966 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7967 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7968 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7969 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7970 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7971 rs_state_ci.depthClampEnable = VK_FALSE;
7972 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7973 rs_state_ci.depthBiasEnable = VK_FALSE;
7974
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007976 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7977 gp_ci.stageCount = 2;
7978 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007979 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007980 // Not setting VP state w/o dynamic vp state should cause validation error
7981 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007982 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007983 gp_ci.pVertexInputState = &vi_ci;
7984 gp_ci.pInputAssemblyState = &ia_ci;
7985 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007986 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7987 gp_ci.layout = pipeline_layout;
7988 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989
7990 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007991 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992
7993 VkPipeline pipeline;
7994 VkPipelineCache pipelineCache;
7995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007996 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007998 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008000 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008001
Chia-I Wuf7458c52015-10-26 21:10:41 +08008002 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8003 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8004 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008007
8008// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8009// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008010TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8011 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008012
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008014
Tony Barbour1fa09702017-03-16 12:09:08 -06008015 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008016
8017 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008018 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008019 return;
8020 }
8021
Tobin Ehlise68360f2015-10-01 11:15:13 -06008022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008023
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008024 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008025 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8026 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008027
8028 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008029 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8030 ds_pool_ci.maxSets = 1;
8031 ds_pool_ci.poolSizeCount = 1;
8032 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008033
8034 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008035 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036 ASSERT_VK_SUCCESS(err);
8037
8038 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008039 dsl_binding.binding = 0;
8040 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8041 dsl_binding.descriptorCount = 1;
8042 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008043
8044 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008045 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8046 ds_layout_ci.bindingCount = 1;
8047 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008048
8049 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008050 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008051 ASSERT_VK_SUCCESS(err);
8052
8053 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008055 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008056 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008057 alloc_info.descriptorPool = ds_pool;
8058 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008063 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8064 pipeline_layout_ci.setLayoutCount = 1;
8065 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008066
8067 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008069 ASSERT_VK_SUCCESS(err);
8070
8071 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008072 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8073 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008074 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008075 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008076 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008077
8078 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8079 // Set scissor as dynamic to avoid that error
8080 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008081 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8082 dyn_state_ci.dynamicStateCount = 1;
8083 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008085 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8086 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8087 pipe_ms_state_ci.pNext = NULL;
8088 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8089 pipe_ms_state_ci.sampleShadingEnable = 0;
8090 pipe_ms_state_ci.minSampleShading = 1.0;
8091 pipe_ms_state_ci.pSampleMask = NULL;
8092
Cody Northropeb3a6c12015-10-05 14:44:45 -06008093 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008094 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008096 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008097 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8098 // 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 +08008099 shaderStages[0] = vs.GetStageCreateInfo();
8100 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008101
Cody Northropf6622dc2015-10-06 10:33:21 -06008102 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8103 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8104 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008105 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008106 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008107 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008108 vi_ci.pVertexAttributeDescriptions = nullptr;
8109
8110 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8111 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8112 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8113
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008114 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008115 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008116 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008117 rs_ci.pNext = nullptr;
8118
Mark Youngc89c6312016-03-31 16:03:20 -06008119 VkPipelineColorBlendAttachmentState att = {};
8120 att.blendEnable = VK_FALSE;
8121 att.colorWriteMask = 0xf;
8122
Cody Northropf6622dc2015-10-06 10:33:21 -06008123 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8124 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8125 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008126 cb_ci.attachmentCount = 1;
8127 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008128
Tobin Ehlise68360f2015-10-01 11:15:13 -06008129 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008130 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8131 gp_ci.stageCount = 2;
8132 gp_ci.pStages = shaderStages;
8133 gp_ci.pVertexInputState = &vi_ci;
8134 gp_ci.pInputAssemblyState = &ia_ci;
8135 gp_ci.pViewportState = &vp_state_ci;
8136 gp_ci.pRasterizationState = &rs_ci;
8137 gp_ci.pColorBlendState = &cb_ci;
8138 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008139 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008140 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8141 gp_ci.layout = pipeline_layout;
8142 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008143
8144 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008145 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008146
8147 VkPipeline pipeline;
8148 VkPipelineCache pipelineCache;
8149
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008152 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008154 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008155
Tobin Ehlisd332f282015-10-02 11:00:56 -06008156 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008157 // First need to successfully create the PSO from above by setting
8158 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008159 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 -07008160
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008161 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008162 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008163 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008164 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008165 m_commandBuffer->BeginCommandBuffer();
8166 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008168 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008169 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008170 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008171 Draw(1, 0, 0, 0);
8172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008173 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008174
8175 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8176 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8177 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8178 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008179 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008180}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008181
8182// 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 -07008183// viewportCount
8184TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8185 VkResult err;
8186
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008188
Tony Barbour1fa09702017-03-16 12:09:08 -06008189 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008190
8191 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008192 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008193 return;
8194 }
8195
Karl Schultz6addd812016-02-02 17:17:23 -07008196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8197
8198 VkDescriptorPoolSize ds_type_count = {};
8199 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8200 ds_type_count.descriptorCount = 1;
8201
8202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8204 ds_pool_ci.maxSets = 1;
8205 ds_pool_ci.poolSizeCount = 1;
8206 ds_pool_ci.pPoolSizes = &ds_type_count;
8207
8208 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008210 ASSERT_VK_SUCCESS(err);
8211
8212 VkDescriptorSetLayoutBinding dsl_binding = {};
8213 dsl_binding.binding = 0;
8214 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8215 dsl_binding.descriptorCount = 1;
8216 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8217
8218 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8219 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8220 ds_layout_ci.bindingCount = 1;
8221 ds_layout_ci.pBindings = &dsl_binding;
8222
8223 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008224 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008225 ASSERT_VK_SUCCESS(err);
8226
8227 VkDescriptorSet descriptorSet;
8228 VkDescriptorSetAllocateInfo alloc_info = {};
8229 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8230 alloc_info.descriptorSetCount = 1;
8231 alloc_info.descriptorPool = ds_pool;
8232 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008233 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008234 ASSERT_VK_SUCCESS(err);
8235
8236 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8237 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8238 pipeline_layout_ci.setLayoutCount = 1;
8239 pipeline_layout_ci.pSetLayouts = &ds_layout;
8240
8241 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008242 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008243 ASSERT_VK_SUCCESS(err);
8244
8245 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8246 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8247 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008248 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008249 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008250 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008251
8252 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8253 // Set scissor as dynamic to avoid that error
8254 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8255 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8256 dyn_state_ci.dynamicStateCount = 1;
8257 dyn_state_ci.pDynamicStates = &vp_state;
8258
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008259 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8260 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8261 pipe_ms_state_ci.pNext = NULL;
8262 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8263 pipe_ms_state_ci.sampleShadingEnable = 0;
8264 pipe_ms_state_ci.minSampleShading = 1.0;
8265 pipe_ms_state_ci.pSampleMask = NULL;
8266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkPipelineShaderStageCreateInfo shaderStages[2];
8268 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008270 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008271 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8272 // 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 -07008273 shaderStages[0] = vs.GetStageCreateInfo();
8274 shaderStages[1] = fs.GetStageCreateInfo();
8275
8276 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8277 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8278 vi_ci.pNext = nullptr;
8279 vi_ci.vertexBindingDescriptionCount = 0;
8280 vi_ci.pVertexBindingDescriptions = nullptr;
8281 vi_ci.vertexAttributeDescriptionCount = 0;
8282 vi_ci.pVertexAttributeDescriptions = nullptr;
8283
8284 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8285 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8286 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8287
8288 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8289 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008290 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008291 rs_ci.pNext = nullptr;
8292
Mark Youngc89c6312016-03-31 16:03:20 -06008293 VkPipelineColorBlendAttachmentState att = {};
8294 att.blendEnable = VK_FALSE;
8295 att.colorWriteMask = 0xf;
8296
Karl Schultz6addd812016-02-02 17:17:23 -07008297 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8298 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8299 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008300 cb_ci.attachmentCount = 1;
8301 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008302
8303 VkGraphicsPipelineCreateInfo gp_ci = {};
8304 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8305 gp_ci.stageCount = 2;
8306 gp_ci.pStages = shaderStages;
8307 gp_ci.pVertexInputState = &vi_ci;
8308 gp_ci.pInputAssemblyState = &ia_ci;
8309 gp_ci.pViewportState = &vp_state_ci;
8310 gp_ci.pRasterizationState = &rs_ci;
8311 gp_ci.pColorBlendState = &cb_ci;
8312 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008313 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008314 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8315 gp_ci.layout = pipeline_layout;
8316 gp_ci.renderPass = renderPass();
8317
8318 VkPipelineCacheCreateInfo pc_ci = {};
8319 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8320
8321 VkPipeline pipeline;
8322 VkPipelineCache pipelineCache;
8323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008324 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008325 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008328 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008329
8330 // Now hit second fail case where we set scissor w/ different count than PSO
8331 // First need to successfully create the PSO from above by setting
8332 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8334 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008335
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008336 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008337 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008339 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008340 m_commandBuffer->BeginCommandBuffer();
8341 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008343 VkViewport viewports[1] = {};
8344 viewports[0].width = 8;
8345 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008346 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008347 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008348 Draw(1, 0, 0, 0);
8349
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008350 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008351
Chia-I Wuf7458c52015-10-26 21:10:41 +08008352 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8353 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008356 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008357}
8358
Mark Young7394fdd2016-03-31 14:56:43 -06008359TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8360 VkResult err;
8361
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008363
Tony Barbour1fa09702017-03-16 12:09:08 -06008364 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8366
8367 VkDescriptorPoolSize ds_type_count = {};
8368 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8369 ds_type_count.descriptorCount = 1;
8370
8371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8373 ds_pool_ci.maxSets = 1;
8374 ds_pool_ci.poolSizeCount = 1;
8375 ds_pool_ci.pPoolSizes = &ds_type_count;
8376
8377 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008378 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008379 ASSERT_VK_SUCCESS(err);
8380
8381 VkDescriptorSetLayoutBinding dsl_binding = {};
8382 dsl_binding.binding = 0;
8383 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8384 dsl_binding.descriptorCount = 1;
8385 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8386
8387 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8388 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8389 ds_layout_ci.bindingCount = 1;
8390 ds_layout_ci.pBindings = &dsl_binding;
8391
8392 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008394 ASSERT_VK_SUCCESS(err);
8395
8396 VkDescriptorSet descriptorSet;
8397 VkDescriptorSetAllocateInfo alloc_info = {};
8398 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8399 alloc_info.descriptorSetCount = 1;
8400 alloc_info.descriptorPool = ds_pool;
8401 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008403 ASSERT_VK_SUCCESS(err);
8404
8405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8407 pipeline_layout_ci.setLayoutCount = 1;
8408 pipeline_layout_ci.pSetLayouts = &ds_layout;
8409
8410 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008411 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008412 ASSERT_VK_SUCCESS(err);
8413
8414 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8415 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8416 vp_state_ci.scissorCount = 1;
8417 vp_state_ci.pScissors = NULL;
8418 vp_state_ci.viewportCount = 1;
8419 vp_state_ci.pViewports = NULL;
8420
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008421 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008422 // Set scissor as dynamic to avoid that error
8423 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8424 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8425 dyn_state_ci.dynamicStateCount = 2;
8426 dyn_state_ci.pDynamicStates = dynamic_states;
8427
8428 VkPipelineShaderStageCreateInfo shaderStages[2];
8429 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008431 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8432 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008433 this); // TODO - We shouldn't need a fragment shader
8434 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008435 shaderStages[0] = vs.GetStageCreateInfo();
8436 shaderStages[1] = fs.GetStageCreateInfo();
8437
8438 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8439 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8440 vi_ci.pNext = nullptr;
8441 vi_ci.vertexBindingDescriptionCount = 0;
8442 vi_ci.pVertexBindingDescriptions = nullptr;
8443 vi_ci.vertexAttributeDescriptionCount = 0;
8444 vi_ci.pVertexAttributeDescriptions = nullptr;
8445
8446 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8447 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8448 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8449
8450 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8451 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8452 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008453 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008454
Mark Young47107952016-05-02 15:59:55 -06008455 // Check too low (line width of -1.0f).
8456 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008457
8458 VkPipelineColorBlendAttachmentState att = {};
8459 att.blendEnable = VK_FALSE;
8460 att.colorWriteMask = 0xf;
8461
8462 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8463 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8464 cb_ci.pNext = nullptr;
8465 cb_ci.attachmentCount = 1;
8466 cb_ci.pAttachments = &att;
8467
8468 VkGraphicsPipelineCreateInfo gp_ci = {};
8469 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8470 gp_ci.stageCount = 2;
8471 gp_ci.pStages = shaderStages;
8472 gp_ci.pVertexInputState = &vi_ci;
8473 gp_ci.pInputAssemblyState = &ia_ci;
8474 gp_ci.pViewportState = &vp_state_ci;
8475 gp_ci.pRasterizationState = &rs_ci;
8476 gp_ci.pColorBlendState = &cb_ci;
8477 gp_ci.pDynamicState = &dyn_state_ci;
8478 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8479 gp_ci.layout = pipeline_layout;
8480 gp_ci.renderPass = renderPass();
8481
8482 VkPipelineCacheCreateInfo pc_ci = {};
8483 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8484
8485 VkPipeline pipeline;
8486 VkPipelineCache pipelineCache;
8487
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008489 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008490 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008491
8492 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008493 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008494
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008496
8497 // Check too high (line width of 65536.0f).
8498 rs_ci.lineWidth = 65536.0f;
8499
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008500 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008501 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008503
8504 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008505 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008506
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008508
8509 dyn_state_ci.dynamicStateCount = 3;
8510
8511 rs_ci.lineWidth = 1.0f;
8512
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008513 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008514 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008515 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008516 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008517 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008518
8519 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008520 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008521 m_errorMonitor->VerifyFound();
8522
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008524
8525 // Check too high with dynamic setting.
8526 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8527 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008528 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008529
8530 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008534 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008535}
8536
Karl Schultz6addd812016-02-02 17:17:23 -07008537TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008538 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008540 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008541
Tony Barbour1fa09702017-03-16 12:09:08 -06008542 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008544
Tony Barbour552f6c02016-12-21 14:34:07 -07008545 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008546 // Don't care about RenderPass handle b/c error should be flagged before
8547 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008550 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008551}
8552
Karl Schultz6addd812016-02-02 17:17:23 -07008553TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008554 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8556 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008557
Tony Barbour1fa09702017-03-16 12:09:08 -06008558 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008560
Tony Barbour552f6c02016-12-21 14:34:07 -07008561 m_commandBuffer->BeginCommandBuffer();
8562 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008563 // Just create a dummy Renderpass that's non-NULL so we can get to the
8564 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008565 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008567 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008568}
8569
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008570TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008571 TEST_DESCRIPTION(
8572 "Begin a renderPass where clearValueCount is less than"
8573 "the number of renderPass attachments that use loadOp"
8574 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008575
Tony Barbour1fa09702017-03-16 12:09:08 -06008576 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8578
8579 // Create a renderPass with a single attachment that uses loadOp CLEAR
8580 VkAttachmentReference attach = {};
8581 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8582 VkSubpassDescription subpass = {};
8583 subpass.inputAttachmentCount = 1;
8584 subpass.pInputAttachments = &attach;
8585 VkRenderPassCreateInfo rpci = {};
8586 rpci.subpassCount = 1;
8587 rpci.pSubpasses = &subpass;
8588 rpci.attachmentCount = 1;
8589 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008590 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008591 // Set loadOp to CLEAR
8592 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8593 rpci.pAttachments = &attach_desc;
8594 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8595 VkRenderPass rp;
8596 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8597
8598 VkCommandBufferInheritanceInfo hinfo = {};
8599 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8600 hinfo.renderPass = VK_NULL_HANDLE;
8601 hinfo.subpass = 0;
8602 hinfo.framebuffer = VK_NULL_HANDLE;
8603 hinfo.occlusionQueryEnable = VK_FALSE;
8604 hinfo.queryFlags = 0;
8605 hinfo.pipelineStatistics = 0;
8606 VkCommandBufferBeginInfo info = {};
8607 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8608 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8609 info.pInheritanceInfo = &hinfo;
8610
8611 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8612 VkRenderPassBeginInfo rp_begin = {};
8613 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8614 rp_begin.pNext = NULL;
8615 rp_begin.renderPass = renderPass();
8616 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008617 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008618
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008620
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008621 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008622
8623 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008624
8625 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008626}
8627
Slawomir Cygan0808f392016-11-28 17:53:23 +01008628TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008629 TEST_DESCRIPTION(
8630 "Begin a renderPass where clearValueCount is greater than"
8631 "the number of renderPass attachments that use loadOp"
8632 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008633
Tony Barbour1fa09702017-03-16 12:09:08 -06008634 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8636
8637 // Create a renderPass with a single attachment that uses loadOp CLEAR
8638 VkAttachmentReference attach = {};
8639 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8640 VkSubpassDescription subpass = {};
8641 subpass.inputAttachmentCount = 1;
8642 subpass.pInputAttachments = &attach;
8643 VkRenderPassCreateInfo rpci = {};
8644 rpci.subpassCount = 1;
8645 rpci.pSubpasses = &subpass;
8646 rpci.attachmentCount = 1;
8647 VkAttachmentDescription attach_desc = {};
8648 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8649 // Set loadOp to CLEAR
8650 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8651 rpci.pAttachments = &attach_desc;
8652 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8653 VkRenderPass rp;
8654 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8655
8656 VkCommandBufferBeginInfo info = {};
8657 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8658 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8659
8660 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8661 VkRenderPassBeginInfo rp_begin = {};
8662 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8663 rp_begin.pNext = NULL;
8664 rp_begin.renderPass = renderPass();
8665 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008666 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008667
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8669 " has a clearValueCount of"
8670 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008671
8672 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8673
8674 m_errorMonitor->VerifyFound();
8675
8676 vkDestroyRenderPass(m_device->device(), rp, NULL);
8677}
8678
Cody Northrop3bb4d962016-05-09 16:15:57 -06008679TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008680 TEST_DESCRIPTION("End a command buffer with an active render pass");
8681
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8683 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008684
Tony Barbour1fa09702017-03-16 12:09:08 -06008685 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8687
Tony Barbour552f6c02016-12-21 14:34:07 -07008688 m_commandBuffer->BeginCommandBuffer();
8689 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8690 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008691
8692 m_errorMonitor->VerifyFound();
8693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8695 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008696}
8697
Karl Schultz6addd812016-02-02 17:17:23 -07008698TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008699 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702
Tony Barbour1fa09702017-03-16 12:09:08 -06008703 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008705
Tony Barbour552f6c02016-12-21 14:34:07 -07008706 m_commandBuffer->BeginCommandBuffer();
8707 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708
8709 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008710 vk_testing::Buffer dstBuffer;
8711 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008713 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008714
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008715 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008716}
8717
Karl Schultz6addd812016-02-02 17:17:23 -07008718TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008719 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8721 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008722
Tony Barbour1fa09702017-03-16 12:09:08 -06008723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008725
Tony Barbour552f6c02016-12-21 14:34:07 -07008726 m_commandBuffer->BeginCommandBuffer();
8727 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008728
8729 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008730 vk_testing::Buffer dstBuffer;
8731 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008732
Karl Schultz6addd812016-02-02 17:17:23 -07008733 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008734 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8735 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8736 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008738 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008739}
8740
Karl Schultz6addd812016-02-02 17:17:23 -07008741TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008742 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8744 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745
Tony Barbour1fa09702017-03-16 12:09:08 -06008746 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748
Tony Barbour552f6c02016-12-21 14:34:07 -07008749 m_commandBuffer->BeginCommandBuffer();
8750 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008751
Michael Lentine0a369f62016-02-03 16:51:46 -06008752 VkClearColorValue clear_color;
8753 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008754 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8755 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8756 const int32_t tex_width = 32;
8757 const int32_t tex_height = 32;
8758 VkImageCreateInfo image_create_info = {};
8759 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8760 image_create_info.pNext = NULL;
8761 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8762 image_create_info.format = tex_format;
8763 image_create_info.extent.width = tex_width;
8764 image_create_info.extent.height = tex_height;
8765 image_create_info.extent.depth = 1;
8766 image_create_info.mipLevels = 1;
8767 image_create_info.arrayLayers = 1;
8768 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8769 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008770 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008771
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008772 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008773 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008774
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008775 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008777 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008779 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008780}
8781
Karl Schultz6addd812016-02-02 17:17:23 -07008782TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8785 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008786
Tony Barbour1fa09702017-03-16 12:09:08 -06008787 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008789
Dave Houlton1d2022c2017-03-29 11:43:58 -06008790 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008791 if (!depth_format) {
8792 printf(" No Depth + Stencil format found. Skipped.\n");
8793 return;
8794 }
8795
Tony Barbour552f6c02016-12-21 14:34:07 -07008796 m_commandBuffer->BeginCommandBuffer();
8797 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008798
8799 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008800 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008801 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8802 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008803 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008804 image_create_info.extent.width = 64;
8805 image_create_info.extent.height = 64;
8806 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8807 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008808
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008809 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008810 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008811
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008812 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008813
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008814 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8815 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008817 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008818}
8819
Karl Schultz6addd812016-02-02 17:17:23 -07008820TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008821 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008822 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8825 "vkCmdClearAttachments(): This call "
8826 "must be issued inside an active "
8827 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008828
Tony Barbour1fa09702017-03-16 12:09:08 -06008829 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008831
8832 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008833 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008834 ASSERT_VK_SUCCESS(err);
8835
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008836 VkClearAttachment color_attachment;
8837 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8838 color_attachment.clearValue.color.float32[0] = 0;
8839 color_attachment.clearValue.color.float32[1] = 0;
8840 color_attachment.clearValue.color.float32[2] = 0;
8841 color_attachment.clearValue.color.float32[3] = 0;
8842 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008843 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008844 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008845
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008846 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008847}
8848
Chris Forbes3b97e932016-09-07 11:29:24 +12008849TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008850 TEST_DESCRIPTION(
8851 "Test that an error is produced when CmdNextSubpass is "
8852 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008853
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8855 "vkCmdNextSubpass(): Attempted to advance "
8856 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008857
Tony Barbour1fa09702017-03-16 12:09:08 -06008858 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8860
Tony Barbour552f6c02016-12-21 14:34:07 -07008861 m_commandBuffer->BeginCommandBuffer();
8862 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008863
8864 // error here.
8865 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8866 m_errorMonitor->VerifyFound();
8867
Tony Barbour552f6c02016-12-21 14:34:07 -07008868 m_commandBuffer->EndRenderPass();
8869 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008870}
8871
Chris Forbes6d624702016-09-07 13:57:05 +12008872TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008873 TEST_DESCRIPTION(
8874 "Test that an error is produced when CmdEndRenderPass is "
8875 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8878 "vkCmdEndRenderPass(): Called before reaching "
8879 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008880
Tony Barbour1fa09702017-03-16 12:09:08 -06008881 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008882 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8883 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008884
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008885 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008886
8887 VkRenderPass rp;
8888 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8889 ASSERT_VK_SUCCESS(err);
8890
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008891 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008892
8893 VkFramebuffer fb;
8894 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8895 ASSERT_VK_SUCCESS(err);
8896
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008897 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008898
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008899 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 +12008900
8901 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8902
8903 // Error here.
8904 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8905 m_errorMonitor->VerifyFound();
8906
8907 // Clean up.
8908 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8909 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8910}
8911
Karl Schultz9e66a292016-04-21 15:57:51 -06008912TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8913 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8915 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008916
Tony Barbour1fa09702017-03-16 12:09:08 -06008917 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008919
8920 VkBufferMemoryBarrier buf_barrier = {};
8921 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8922 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8923 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8924 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8925 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8926 buf_barrier.buffer = VK_NULL_HANDLE;
8927 buf_barrier.offset = 0;
8928 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8930 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008931
8932 m_errorMonitor->VerifyFound();
8933}
8934
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008935TEST_F(VkLayerTest, InvalidBarriers) {
8936 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8937
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008939
Tony Barbour1fa09702017-03-16 12:09:08 -06008940 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06008941 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008942 if (!depth_format) {
8943 printf(" No Depth + Stencil format found. Skipped.\n");
8944 return;
8945 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008946 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8947
8948 VkMemoryBarrier mem_barrier = {};
8949 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8950 mem_barrier.pNext = NULL;
8951 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8952 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008953 m_commandBuffer->BeginCommandBuffer();
8954 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008955 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008956 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008957 &mem_barrier, 0, nullptr, 0, nullptr);
8958 m_errorMonitor->VerifyFound();
8959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008961 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06008962 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 -06008963 ASSERT_TRUE(image.initialized());
8964 VkImageMemoryBarrier img_barrier = {};
8965 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8966 img_barrier.pNext = NULL;
8967 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8968 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8969 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8970 // New layout can't be UNDEFINED
8971 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8972 img_barrier.image = image.handle();
8973 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8974 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8975 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8976 img_barrier.subresourceRange.baseArrayLayer = 0;
8977 img_barrier.subresourceRange.baseMipLevel = 0;
8978 img_barrier.subresourceRange.layerCount = 1;
8979 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008980 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8981 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008982 m_errorMonitor->VerifyFound();
8983 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8984
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8986 "Subresource must have the sum of the "
8987 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008988 // baseArrayLayer + layerCount must be <= image's arrayLayers
8989 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008990 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8991 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008992 m_errorMonitor->VerifyFound();
8993 img_barrier.subresourceRange.baseArrayLayer = 0;
8994
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008996 // baseMipLevel + levelCount must be <= image's mipLevels
8997 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008998 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8999 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009000 m_errorMonitor->VerifyFound();
9001 img_barrier.subresourceRange.baseMipLevel = 0;
9002
Mike Weiblen7053aa32017-01-25 15:21:10 -07009003 // levelCount must be non-zero.
9004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9005 img_barrier.subresourceRange.levelCount = 0;
9006 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9007 nullptr, 0, nullptr, 1, &img_barrier);
9008 m_errorMonitor->VerifyFound();
9009 img_barrier.subresourceRange.levelCount = 1;
9010
9011 // layerCount must be non-zero.
9012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9013 img_barrier.subresourceRange.layerCount = 0;
9014 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9015 nullptr, 0, nullptr, 1, &img_barrier);
9016 m_errorMonitor->VerifyFound();
9017 img_barrier.subresourceRange.layerCount = 1;
9018
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009019 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 -06009020 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009021 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9022 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023 VkBufferMemoryBarrier buf_barrier = {};
9024 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9025 buf_barrier.pNext = NULL;
9026 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9027 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9028 buf_barrier.buffer = buffer.handle();
9029 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9030 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9031 buf_barrier.offset = 0;
9032 buf_barrier.size = VK_WHOLE_SIZE;
9033 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009034 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9035 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009036 m_errorMonitor->VerifyFound();
9037 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9038
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009040 buf_barrier.offset = 257;
9041 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009042 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9043 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009044 m_errorMonitor->VerifyFound();
9045 buf_barrier.offset = 0;
9046
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009048 buf_barrier.size = 257;
9049 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009050 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9051 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009052 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009053
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009055 m_errorMonitor->SetDesiredFailureMsg(
9056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009057 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009058 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009059 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009060 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009061 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9062 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009063 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009064
9065 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009066 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009067 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9068 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009069 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009070
9071 // Having anything other than DEPTH or STENCIL is an error
9072 m_errorMonitor->SetDesiredFailureMsg(
9073 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9074 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9075 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9076 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9077 nullptr, 0, nullptr, 1, &img_barrier);
9078 m_errorMonitor->VerifyFound();
9079
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009080 // Now test depth-only
9081 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009082 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9083 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009084 VkDepthStencilObj d_image(m_device);
9085 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9086 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009087 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009088 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009089 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009090
9091 // DEPTH bit must be set
9092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9093 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009094 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009095 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9096 0, nullptr, 0, nullptr, 1, &img_barrier);
9097 m_errorMonitor->VerifyFound();
9098
9099 // No bits other than DEPTH may be set
9100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9102 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009103 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9104 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009105 m_errorMonitor->VerifyFound();
9106 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009107
9108 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009109 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009111 VkDepthStencilObj s_image(m_device);
9112 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9113 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009114 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009115 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009116 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009117 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9119 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009120 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9122 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009123 m_errorMonitor->VerifyFound();
9124 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009125
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009126 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009127 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009128 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 -06009129 ASSERT_TRUE(c_image.initialized());
9130 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9131 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9132 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009133
9134 // COLOR bit must be set
9135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9136 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009137 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009138 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9139 nullptr, 0, nullptr, 1, &img_barrier);
9140 m_errorMonitor->VerifyFound();
9141
9142 // No bits other than COLOR may be set
9143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9144 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9145 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9147 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009148 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009149
Mike Weiblene6e01172017-03-07 22:18:40 -07009150 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9151 {
9152 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009153 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 -07009154 ASSERT_TRUE(img_color.initialized());
9155
9156 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009157 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 -07009158 ASSERT_TRUE(img_ds.initialized());
9159
9160 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009161 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 -07009162 ASSERT_TRUE(img_xfer_src.initialized());
9163
9164 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009165 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 -07009166 ASSERT_TRUE(img_xfer_dst.initialized());
9167
9168 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009169 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 -07009170 ASSERT_TRUE(img_sampled.initialized());
9171
9172 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009173 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 -07009174 ASSERT_TRUE(img_input.initialized());
9175
9176 const struct {
9177 VkImageObj &image_obj;
9178 VkImageLayout bad_layout;
9179 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9180 } bad_buffer_layouts[] = {
9181 // clang-format off
9182 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9183 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9184 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9185 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9186 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9187 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9188 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9189 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9190 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9191 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9192 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9193 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9194 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9195 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9196 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9197 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9198 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9199 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9200 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9201 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9202 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9203 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9204 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9205 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9206 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9207 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9208 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9209 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9210 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9211 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9212 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9213 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9214 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9215 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9216 // clang-format on
9217 };
9218 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9219
9220 for (uint32_t i = 0; i < layout_count; ++i) {
9221 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9222 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9223 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9224 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9225 : VK_IMAGE_ASPECT_COLOR_BIT;
9226
9227 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9228 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9230 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9231 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9232 m_errorMonitor->VerifyFound();
9233
9234 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9235 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9237 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9238 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9239 m_errorMonitor->VerifyFound();
9240 }
9241
9242 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9243 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9244 }
9245
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009246 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9247
9248 // Create command pool with incompatible queueflags
9249 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009250 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009251 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009252 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009253 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009254 }
9255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9256
9257 VkCommandPool command_pool;
9258 VkCommandPoolCreateInfo pool_create_info{};
9259 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9260 pool_create_info.queueFamilyIndex = queue_family_index;
9261 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9262 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9263
9264 // Allocate a command buffer
9265 VkCommandBuffer bad_command_buffer;
9266 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9267 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9268 command_buffer_allocate_info.commandPool = command_pool;
9269 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9270 command_buffer_allocate_info.commandBufferCount = 1;
9271 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9272
9273 VkCommandBufferBeginInfo cbbi = {};
9274 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9275 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9276 buf_barrier.offset = 0;
9277 buf_barrier.size = VK_WHOLE_SIZE;
9278 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9279 &buf_barrier, 0, nullptr);
9280 m_errorMonitor->VerifyFound();
9281
9282 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9283 vkEndCommandBuffer(bad_command_buffer);
9284 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009285 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009286 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009287 }
9288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9289 VkEvent event;
9290 VkEventCreateInfo event_create_info{};
9291 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9292 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9293 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9294 nullptr, 0, nullptr);
9295 m_errorMonitor->VerifyFound();
9296
9297 vkEndCommandBuffer(bad_command_buffer);
9298 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009299}
9300
Tony Barbour18ba25c2016-09-29 13:42:40 -06009301TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9302 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9303
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009305 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009306 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009307 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 -07009308 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009309 ASSERT_TRUE(image.initialized());
9310
9311 VkImageMemoryBarrier barrier = {};
9312 VkImageSubresourceRange range;
9313 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9314 barrier.srcAccessMask = 0;
9315 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9316 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9317 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9318 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9319 barrier.image = image.handle();
9320 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9321 range.baseMipLevel = 0;
9322 range.levelCount = 1;
9323 range.baseArrayLayer = 0;
9324 range.layerCount = 1;
9325 barrier.subresourceRange = range;
9326 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9327 cmdbuf.BeginCommandBuffer();
9328 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9329 &barrier);
9330 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9331 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9332 barrier.srcAccessMask = 0;
9333 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9334 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9335 &barrier);
9336
9337 m_errorMonitor->VerifyFound();
9338}
9339
Karl Schultz6addd812016-02-02 17:17:23 -07009340TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009341 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009342 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009344
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009345 uint32_t const indices[] = {0};
9346 VkBufferCreateInfo buf_info = {};
9347 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9348 buf_info.size = 1024;
9349 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9350 buf_info.queueFamilyIndexCount = 1;
9351 buf_info.pQueueFamilyIndices = indices;
9352
9353 VkBuffer buffer;
9354 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9355 ASSERT_VK_SUCCESS(err);
9356
9357 VkMemoryRequirements requirements;
9358 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9359
9360 VkMemoryAllocateInfo alloc_info{};
9361 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9362 alloc_info.pNext = NULL;
9363 alloc_info.memoryTypeIndex = 0;
9364 alloc_info.allocationSize = requirements.size;
9365 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9366 ASSERT_TRUE(pass);
9367
9368 VkDeviceMemory memory;
9369 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9370 ASSERT_VK_SUCCESS(err);
9371
9372 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009373 ASSERT_VK_SUCCESS(err);
9374
Tony Barbour552f6c02016-12-21 14:34:07 -07009375 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009376 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009377
Karl Schultz6addd812016-02-02 17:17:23 -07009378 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9379 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009380 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9382 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009383 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009384
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009385 vkFreeMemory(m_device->device(), memory, NULL);
9386 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009387}
9388
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009389TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9390 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009391 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9393 VkBufferCreateInfo buffCI = {};
9394 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9395 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009396 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009397 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009398 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009399 uint32_t qfi[2];
9400 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009401 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009402
9403 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009404 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009405
9406 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9408 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9409 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009410 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009411 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009412
9413 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009414 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9416
9417 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9418 buffCI.queueFamilyIndexCount = 2;
9419 qfi[0] = 1;
9420 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009421 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009422 VkDeviceMemory mem;
9423 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009424 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009425
9426 VkMemoryAllocateInfo alloc_info = {};
9427 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9428 alloc_info.allocationSize = 1024;
9429 bool pass = false;
9430 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9431 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009432 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009433 return;
9434 }
9435 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009436 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009437
9438 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009439 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009440 m_commandBuffer->end();
9441 QueueCommandBuffer(false);
9442 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009443 vkDestroyBuffer(m_device->device(), ib2, NULL);
9444 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009445 }
9446
Tony Barbourdf4c0042016-06-01 15:55:43 -06009447 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009448}
9449
Karl Schultz6addd812016-02-02 17:17:23 -07009450TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009451 TEST_DESCRIPTION(
9452 "Attempt vkCmdExecuteCommands with a primary command buffer"
9453 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009454
Tony Barbour1fa09702017-03-16 12:09:08 -06009455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009457
Chris Forbesf29a84f2016-10-06 18:39:28 +13009458 // An empty primary command buffer
9459 VkCommandBufferObj cb(m_device, m_commandPool);
9460 cb.BeginCommandBuffer();
9461 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009462
Chris Forbesf29a84f2016-10-06 18:39:28 +13009463 m_commandBuffer->BeginCommandBuffer();
9464 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9465 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009466
Chris Forbesf29a84f2016-10-06 18:39:28 +13009467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9468 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009469 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009470
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009471 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009472}
9473
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009474TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009475 TEST_DESCRIPTION(
9476 "Attempt to update descriptor sets for images and buffers "
9477 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009478 VkResult err;
9479
Tony Barbour1fa09702017-03-16 12:09:08 -06009480 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009481 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9482 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9483 ds_type_count[i].type = VkDescriptorType(i);
9484 ds_type_count[i].descriptorCount = 1;
9485 }
9486 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9487 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9488 ds_pool_ci.pNext = NULL;
9489 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9490 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9491 ds_pool_ci.pPoolSizes = ds_type_count;
9492
9493 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009494 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009495 ASSERT_VK_SUCCESS(err);
9496
9497 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009498 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009499 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9500 dsl_binding[i].binding = 0;
9501 dsl_binding[i].descriptorType = VkDescriptorType(i);
9502 dsl_binding[i].descriptorCount = 1;
9503 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9504 dsl_binding[i].pImmutableSamplers = NULL;
9505 }
9506
9507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9509 ds_layout_ci.pNext = NULL;
9510 ds_layout_ci.bindingCount = 1;
9511 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9512 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9513 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009515 ASSERT_VK_SUCCESS(err);
9516 }
9517 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9518 VkDescriptorSetAllocateInfo alloc_info = {};
9519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9520 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9521 alloc_info.descriptorPool = ds_pool;
9522 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009524 ASSERT_VK_SUCCESS(err);
9525
9526 // Create a buffer & bufferView to be used for invalid updates
9527 VkBufferCreateInfo buff_ci = {};
9528 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009529 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009530 buff_ci.size = 256;
9531 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009532 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009533 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9534 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009535
9536 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9537 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9538 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9539 ASSERT_VK_SUCCESS(err);
9540
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009541 VkMemoryRequirements mem_reqs;
9542 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9543 VkMemoryAllocateInfo mem_alloc_info = {};
9544 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9545 mem_alloc_info.pNext = NULL;
9546 mem_alloc_info.memoryTypeIndex = 0;
9547 mem_alloc_info.allocationSize = mem_reqs.size;
9548 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9549 if (!pass) {
9550 vkDestroyBuffer(m_device->device(), buffer, NULL);
9551 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9552 return;
9553 }
9554 VkDeviceMemory mem;
9555 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9556 ASSERT_VK_SUCCESS(err);
9557 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009559
9560 VkBufferViewCreateInfo buff_view_ci = {};
9561 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9562 buff_view_ci.buffer = buffer;
9563 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9564 buff_view_ci.range = VK_WHOLE_SIZE;
9565 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009567 ASSERT_VK_SUCCESS(err);
9568
Tony Barbour415497c2017-01-24 10:06:09 -07009569 // Now get resources / view for storage_texel_buffer
9570 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9571 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9572 if (!pass) {
9573 vkDestroyBuffer(m_device->device(), buffer, NULL);
9574 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9575 vkFreeMemory(m_device->device(), mem, NULL);
9576 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9577 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9578 return;
9579 }
9580 VkDeviceMemory storage_texel_buffer_mem;
9581 VkBufferView storage_texel_buffer_view;
9582 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9583 ASSERT_VK_SUCCESS(err);
9584 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9585 ASSERT_VK_SUCCESS(err);
9586 buff_view_ci.buffer = storage_texel_buffer;
9587 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9588 ASSERT_VK_SUCCESS(err);
9589
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009590 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009591 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009592 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009593 image_ci.format = VK_FORMAT_UNDEFINED;
9594 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9595 VkFormat format = static_cast<VkFormat>(f);
9596 VkFormatProperties fProps = m_device->format_properties(format);
9597 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9598 image_ci.format = format;
9599 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9600 break;
9601 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9602 image_ci.format = format;
9603 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9604 break;
9605 }
9606 }
9607 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9608 return;
9609 }
9610
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009611 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9612 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009613 image_ci.extent.width = 64;
9614 image_ci.extent.height = 64;
9615 image_ci.extent.depth = 1;
9616 image_ci.mipLevels = 1;
9617 image_ci.arrayLayers = 1;
9618 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009619 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009620 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009621 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9622 VkImage image;
9623 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9624 ASSERT_VK_SUCCESS(err);
9625 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009626 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009627
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009628 VkMemoryAllocateInfo mem_alloc = {};
9629 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9630 mem_alloc.pNext = NULL;
9631 mem_alloc.allocationSize = 0;
9632 mem_alloc.memoryTypeIndex = 0;
9633 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9634 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009635 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009636 ASSERT_TRUE(pass);
9637 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9638 ASSERT_VK_SUCCESS(err);
9639 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9640 ASSERT_VK_SUCCESS(err);
9641 // Now create view for image
9642 VkImageViewCreateInfo image_view_ci = {};
9643 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9644 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009645 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009646 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9647 image_view_ci.subresourceRange.layerCount = 1;
9648 image_view_ci.subresourceRange.baseArrayLayer = 0;
9649 image_view_ci.subresourceRange.levelCount = 1;
9650 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9651 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009652 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009653 ASSERT_VK_SUCCESS(err);
9654
9655 VkDescriptorBufferInfo buff_info = {};
9656 buff_info.buffer = buffer;
9657 VkDescriptorImageInfo img_info = {};
9658 img_info.imageView = image_view;
9659 VkWriteDescriptorSet descriptor_write = {};
9660 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9661 descriptor_write.dstBinding = 0;
9662 descriptor_write.descriptorCount = 1;
9663 descriptor_write.pTexelBufferView = &buff_view;
9664 descriptor_write.pBufferInfo = &buff_info;
9665 descriptor_write.pImageInfo = &img_info;
9666
9667 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009668 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009669 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9670 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9671 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9672 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9673 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9674 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9675 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9676 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9677 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9678 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9679 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009680 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 // Start loop at 1 as SAMPLER desc type has no usage bit error
9682 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009683 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9684 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9685 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9686 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009687 descriptor_write.descriptorType = VkDescriptorType(i);
9688 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009692
9693 m_errorMonitor->VerifyFound();
9694 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009695 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9696 descriptor_write.pTexelBufferView = &buff_view;
9697 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009698 }
Tony Barbour415497c2017-01-24 10:06:09 -07009699
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009700 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9701 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009702 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009703 vkDestroyImageView(m_device->device(), image_view, NULL);
9704 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009705 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009706 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009707 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009708 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009709 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009710 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9711}
9712
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009713TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009714 TEST_DESCRIPTION(
9715 "Attempt to update buffer descriptor set that has incorrect "
9716 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009717 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009718 "2. range value of 0\n"
9719 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009720 VkResult err;
9721
Tony Barbour1fa09702017-03-16 12:09:08 -06009722 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009723 VkDescriptorPoolSize ds_type_count = {};
9724 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9725 ds_type_count.descriptorCount = 1;
9726
9727 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9728 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9729 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009730 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009731 ds_pool_ci.maxSets = 1;
9732 ds_pool_ci.poolSizeCount = 1;
9733 ds_pool_ci.pPoolSizes = &ds_type_count;
9734
9735 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009736 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009737 ASSERT_VK_SUCCESS(err);
9738
9739 // Create layout with single uniform buffer descriptor
9740 VkDescriptorSetLayoutBinding dsl_binding = {};
9741 dsl_binding.binding = 0;
9742 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9743 dsl_binding.descriptorCount = 1;
9744 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9745 dsl_binding.pImmutableSamplers = NULL;
9746
9747 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9748 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9749 ds_layout_ci.pNext = NULL;
9750 ds_layout_ci.bindingCount = 1;
9751 ds_layout_ci.pBindings = &dsl_binding;
9752 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009753 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009754 ASSERT_VK_SUCCESS(err);
9755
9756 VkDescriptorSet descriptor_set = {};
9757 VkDescriptorSetAllocateInfo alloc_info = {};
9758 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9759 alloc_info.descriptorSetCount = 1;
9760 alloc_info.descriptorPool = ds_pool;
9761 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009762 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009763 ASSERT_VK_SUCCESS(err);
9764
9765 // Create a buffer to be used for invalid updates
9766 VkBufferCreateInfo buff_ci = {};
9767 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9768 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009769 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009770 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9771 VkBuffer buffer;
9772 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9773 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009774
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009775 // Have to bind memory to buffer before descriptor update
9776 VkMemoryAllocateInfo mem_alloc = {};
9777 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9778 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009779 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009780 mem_alloc.memoryTypeIndex = 0;
9781
9782 VkMemoryRequirements mem_reqs;
9783 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009784 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009785 if (!pass) {
9786 vkDestroyBuffer(m_device->device(), buffer, NULL);
9787 return;
9788 }
9789
9790 VkDeviceMemory mem;
9791 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9792 ASSERT_VK_SUCCESS(err);
9793 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9794 ASSERT_VK_SUCCESS(err);
9795
9796 VkDescriptorBufferInfo buff_info = {};
9797 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009798 // Cause error due to offset out of range
9799 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009800 buff_info.range = VK_WHOLE_SIZE;
9801 VkWriteDescriptorSet descriptor_write = {};
9802 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9803 descriptor_write.dstBinding = 0;
9804 descriptor_write.descriptorCount = 1;
9805 descriptor_write.pTexelBufferView = nullptr;
9806 descriptor_write.pBufferInfo = &buff_info;
9807 descriptor_write.pImageInfo = nullptr;
9808
9809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9810 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009812
9813 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9814
9815 m_errorMonitor->VerifyFound();
9816 // Now cause error due to range of 0
9817 buff_info.offset = 0;
9818 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009820
9821 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9822
9823 m_errorMonitor->VerifyFound();
9824 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009825 buff_info.offset = 0;
9826 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009828
9829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9830
9831 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009832 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009833 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9834 vkDestroyBuffer(m_device->device(), buffer, NULL);
9835 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9837}
9838
Tobin Ehlis845887e2017-02-02 19:01:44 -07009839TEST_F(VkLayerTest, DSBufferLimitErrors) {
9840 TEST_DESCRIPTION(
9841 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9842 "Test cases include:\n"
9843 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9844 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9845 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9846 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9847 VkResult err;
9848
Tony Barbour1fa09702017-03-16 12:09:08 -06009849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009850 VkDescriptorPoolSize ds_type_count[2] = {};
9851 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9852 ds_type_count[0].descriptorCount = 1;
9853 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9854 ds_type_count[1].descriptorCount = 1;
9855
9856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9858 ds_pool_ci.pNext = NULL;
9859 ds_pool_ci.maxSets = 1;
9860 ds_pool_ci.poolSizeCount = 2;
9861 ds_pool_ci.pPoolSizes = ds_type_count;
9862
9863 VkDescriptorPool ds_pool;
9864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9865 ASSERT_VK_SUCCESS(err);
9866
9867 // Create layout with single uniform buffer & single storage buffer descriptor
9868 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9869 dsl_binding[0].binding = 0;
9870 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9871 dsl_binding[0].descriptorCount = 1;
9872 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9873 dsl_binding[0].pImmutableSamplers = NULL;
9874 dsl_binding[1].binding = 1;
9875 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9876 dsl_binding[1].descriptorCount = 1;
9877 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9878 dsl_binding[1].pImmutableSamplers = NULL;
9879
9880 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9881 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9882 ds_layout_ci.pNext = NULL;
9883 ds_layout_ci.bindingCount = 2;
9884 ds_layout_ci.pBindings = dsl_binding;
9885 VkDescriptorSetLayout ds_layout;
9886 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9887 ASSERT_VK_SUCCESS(err);
9888
9889 VkDescriptorSet descriptor_set = {};
9890 VkDescriptorSetAllocateInfo alloc_info = {};
9891 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9892 alloc_info.descriptorSetCount = 1;
9893 alloc_info.descriptorPool = ds_pool;
9894 alloc_info.pSetLayouts = &ds_layout;
9895 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9896 ASSERT_VK_SUCCESS(err);
9897
9898 // Create a buffer to be used for invalid updates
9899 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9900 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9901 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9902 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9903 VkBufferCreateInfo ub_ci = {};
9904 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9905 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9906 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9907 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9908 VkBuffer uniform_buffer;
9909 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9910 ASSERT_VK_SUCCESS(err);
9911 VkBufferCreateInfo sb_ci = {};
9912 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9913 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9914 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9915 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9916 VkBuffer storage_buffer;
9917 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9918 ASSERT_VK_SUCCESS(err);
9919 // Have to bind memory to buffer before descriptor update
9920 VkMemoryAllocateInfo mem_alloc = {};
9921 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9922 mem_alloc.pNext = NULL;
9923 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9924 mem_alloc.memoryTypeIndex = 0;
9925
Cort Stratton77a0d592017-02-17 13:14:13 -08009926 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9927 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9928 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9929 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9930 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009931 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009932 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009933 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009934 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9935 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009936 return;
9937 }
9938
9939 VkDeviceMemory mem;
9940 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009941 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009942 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009943 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9944 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9945 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9946 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9947 return;
9948 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009949 ASSERT_VK_SUCCESS(err);
9950 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9951 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009952 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009953 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9954 ASSERT_VK_SUCCESS(err);
9955
9956 VkDescriptorBufferInfo buff_info = {};
9957 buff_info.buffer = uniform_buffer;
9958 buff_info.range = ub_ci.size; // This will exceed limit
9959 VkWriteDescriptorSet descriptor_write = {};
9960 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9961 descriptor_write.dstBinding = 0;
9962 descriptor_write.descriptorCount = 1;
9963 descriptor_write.pTexelBufferView = nullptr;
9964 descriptor_write.pBufferInfo = &buff_info;
9965 descriptor_write.pImageInfo = nullptr;
9966
9967 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9968 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009969 if (max_ub_range != UINT32_MAX) {
9970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9971 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9972 m_errorMonitor->VerifyFound();
9973 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009974 // Reduce size of range to acceptable limit & cause offset error
9975 buff_info.range = max_ub_range;
9976 buff_info.offset = min_ub_align - 1;
9977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9978 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9979 m_errorMonitor->VerifyFound();
9980
9981 // Now break storage updates
9982 buff_info.buffer = storage_buffer;
9983 buff_info.range = sb_ci.size; // This will exceed limit
9984 buff_info.offset = 0; // Reset offset for this update
9985
9986 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9987 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009988 if (max_ub_range != UINT32_MAX) {
9989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9990 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9991 m_errorMonitor->VerifyFound();
9992 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009993
9994 // Reduce size of range to acceptable limit & cause offset error
9995 buff_info.range = max_sb_range;
9996 buff_info.offset = min_sb_align - 1;
9997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9998 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9999 m_errorMonitor->VerifyFound();
10000
10001 vkFreeMemory(m_device->device(), mem, NULL);
10002 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10003 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10004 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10006}
10007
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010008TEST_F(VkLayerTest, DSAspectBitsErrors) {
10009 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10010 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010011 TEST_DESCRIPTION(
10012 "Attempt to update descriptor sets for images "
10013 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010014 VkResult err;
10015
Tony Barbour1fa09702017-03-16 12:09:08 -060010016 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010017 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010018 if (!depth_format) {
10019 printf(" No Depth + Stencil format found. Skipped.\n");
10020 return;
10021 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010022 VkDescriptorPoolSize ds_type_count = {};
10023 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10024 ds_type_count.descriptorCount = 1;
10025
10026 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10027 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10028 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010029 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010030 ds_pool_ci.maxSets = 5;
10031 ds_pool_ci.poolSizeCount = 1;
10032 ds_pool_ci.pPoolSizes = &ds_type_count;
10033
10034 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010035 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010036 ASSERT_VK_SUCCESS(err);
10037
10038 VkDescriptorSetLayoutBinding dsl_binding = {};
10039 dsl_binding.binding = 0;
10040 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10041 dsl_binding.descriptorCount = 1;
10042 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10043 dsl_binding.pImmutableSamplers = NULL;
10044
10045 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10046 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10047 ds_layout_ci.pNext = NULL;
10048 ds_layout_ci.bindingCount = 1;
10049 ds_layout_ci.pBindings = &dsl_binding;
10050 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010051 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010052 ASSERT_VK_SUCCESS(err);
10053
10054 VkDescriptorSet descriptor_set = {};
10055 VkDescriptorSetAllocateInfo alloc_info = {};
10056 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10057 alloc_info.descriptorSetCount = 1;
10058 alloc_info.descriptorPool = ds_pool;
10059 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010060 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010061 ASSERT_VK_SUCCESS(err);
10062
10063 // Create an image to be used for invalid updates
10064 VkImageCreateInfo image_ci = {};
10065 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10066 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010067 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010068 image_ci.extent.width = 64;
10069 image_ci.extent.height = 64;
10070 image_ci.extent.depth = 1;
10071 image_ci.mipLevels = 1;
10072 image_ci.arrayLayers = 1;
10073 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010074 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010075 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10076 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10077 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10078 VkImage image;
10079 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10080 ASSERT_VK_SUCCESS(err);
10081 // Bind memory to image
10082 VkMemoryRequirements mem_reqs;
10083 VkDeviceMemory image_mem;
10084 bool pass;
10085 VkMemoryAllocateInfo mem_alloc = {};
10086 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10087 mem_alloc.pNext = NULL;
10088 mem_alloc.allocationSize = 0;
10089 mem_alloc.memoryTypeIndex = 0;
10090 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10091 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010092 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010093 ASSERT_TRUE(pass);
10094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10095 ASSERT_VK_SUCCESS(err);
10096 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10097 ASSERT_VK_SUCCESS(err);
10098 // Now create view for image
10099 VkImageViewCreateInfo image_view_ci = {};
10100 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10101 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010102 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010103 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10104 image_view_ci.subresourceRange.layerCount = 1;
10105 image_view_ci.subresourceRange.baseArrayLayer = 0;
10106 image_view_ci.subresourceRange.levelCount = 1;
10107 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010108 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010109
10110 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010111 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010112 ASSERT_VK_SUCCESS(err);
10113
10114 VkDescriptorImageInfo img_info = {};
10115 img_info.imageView = image_view;
10116 VkWriteDescriptorSet descriptor_write = {};
10117 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10118 descriptor_write.dstBinding = 0;
10119 descriptor_write.descriptorCount = 1;
10120 descriptor_write.pTexelBufferView = NULL;
10121 descriptor_write.pBufferInfo = NULL;
10122 descriptor_write.pImageInfo = &img_info;
10123 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10124 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010125 const char *error_msg =
10126 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10127 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010129
10130 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10131
10132 m_errorMonitor->VerifyFound();
10133 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10134 vkDestroyImage(m_device->device(), image, NULL);
10135 vkFreeMemory(m_device->device(), image_mem, NULL);
10136 vkDestroyImageView(m_device->device(), image_view, NULL);
10137 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10138 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10139}
10140
Karl Schultz6addd812016-02-02 17:17:23 -070010141TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010142 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010143 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10146 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10147 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010148
Tony Barbour1fa09702017-03-16 12:09:08 -060010149 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010150 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010151 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010152 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10153 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010154
10155 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010156 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10157 ds_pool_ci.pNext = NULL;
10158 ds_pool_ci.maxSets = 1;
10159 ds_pool_ci.poolSizeCount = 1;
10160 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010161
Tobin Ehlis3b780662015-05-28 12:11:26 -060010162 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010163 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010164 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010165 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010166 dsl_binding.binding = 0;
10167 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10168 dsl_binding.descriptorCount = 1;
10169 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10170 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010171
Tony Barboureb254902015-07-15 12:50:33 -060010172 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010173 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10174 ds_layout_ci.pNext = NULL;
10175 ds_layout_ci.bindingCount = 1;
10176 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010177
Tobin Ehlis3b780662015-05-28 12:11:26 -060010178 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010179 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010180 ASSERT_VK_SUCCESS(err);
10181
10182 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010183 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010184 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010185 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010186 alloc_info.descriptorPool = ds_pool;
10187 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010188 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010189 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010190
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010191 VkSamplerCreateInfo sampler_ci = {};
10192 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10193 sampler_ci.pNext = NULL;
10194 sampler_ci.magFilter = VK_FILTER_NEAREST;
10195 sampler_ci.minFilter = VK_FILTER_NEAREST;
10196 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10197 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10198 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10199 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10200 sampler_ci.mipLodBias = 1.0;
10201 sampler_ci.anisotropyEnable = VK_FALSE;
10202 sampler_ci.maxAnisotropy = 1;
10203 sampler_ci.compareEnable = VK_FALSE;
10204 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10205 sampler_ci.minLod = 1.0;
10206 sampler_ci.maxLod = 1.0;
10207 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10208 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10209 VkSampler sampler;
10210 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10211 ASSERT_VK_SUCCESS(err);
10212
10213 VkDescriptorImageInfo info = {};
10214 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010215
10216 VkWriteDescriptorSet descriptor_write;
10217 memset(&descriptor_write, 0, sizeof(descriptor_write));
10218 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010219 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010220 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010221 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010222 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010223 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010224
10225 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10226
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010227 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010228
Chia-I Wuf7458c52015-10-26 21:10:41 +080010229 vkDestroySampler(m_device->device(), sampler, NULL);
10230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010232}
10233
Karl Schultz6addd812016-02-02 17:17:23 -070010234TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010235 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010236 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010237
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010239
Tony Barbour1fa09702017-03-16 12:09:08 -060010240 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010241 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010242 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010243 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10244 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010245
10246 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010247 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10248 ds_pool_ci.pNext = NULL;
10249 ds_pool_ci.maxSets = 1;
10250 ds_pool_ci.poolSizeCount = 1;
10251 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010252
Tobin Ehlis3b780662015-05-28 12:11:26 -060010253 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010254 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010255 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010256
Tony Barboureb254902015-07-15 12:50:33 -060010257 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010258 dsl_binding.binding = 0;
10259 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10260 dsl_binding.descriptorCount = 1;
10261 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10262 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010263
10264 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010265 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10266 ds_layout_ci.pNext = NULL;
10267 ds_layout_ci.bindingCount = 1;
10268 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010269
Tobin Ehlis3b780662015-05-28 12:11:26 -060010270 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010272 ASSERT_VK_SUCCESS(err);
10273
10274 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010275 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010277 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010278 alloc_info.descriptorPool = ds_pool;
10279 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010281 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010282
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010283 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10284
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010285 // Correctly update descriptor to avoid "NOT_UPDATED" error
10286 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010287 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010288 buff_info.offset = 0;
10289 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010290
10291 VkWriteDescriptorSet descriptor_write;
10292 memset(&descriptor_write, 0, sizeof(descriptor_write));
10293 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010294 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010295 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010296 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010297 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10298 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010299
10300 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10301
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010302 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010303
Chia-I Wuf7458c52015-10-26 21:10:41 +080010304 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10305 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010306}
10307
Karl Schultz6addd812016-02-02 17:17:23 -070010308TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010309 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010310 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010311
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010313
Tony Barbour1fa09702017-03-16 12:09:08 -060010314 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010315 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010316 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010317 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10318 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010319
10320 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010321 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10322 ds_pool_ci.pNext = NULL;
10323 ds_pool_ci.maxSets = 1;
10324 ds_pool_ci.poolSizeCount = 1;
10325 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010326
Tobin Ehlis3b780662015-05-28 12:11:26 -060010327 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010328 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010329 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330
Tony Barboureb254902015-07-15 12:50:33 -060010331 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010332 dsl_binding.binding = 0;
10333 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10334 dsl_binding.descriptorCount = 1;
10335 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10336 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010337
10338 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010339 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10340 ds_layout_ci.pNext = NULL;
10341 ds_layout_ci.bindingCount = 1;
10342 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010343 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010344 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010345 ASSERT_VK_SUCCESS(err);
10346
10347 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010348 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010349 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010350 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010351 alloc_info.descriptorPool = ds_pool;
10352 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010354 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010355
Tony Barboureb254902015-07-15 12:50:33 -060010356 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010357 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10358 sampler_ci.pNext = NULL;
10359 sampler_ci.magFilter = VK_FILTER_NEAREST;
10360 sampler_ci.minFilter = VK_FILTER_NEAREST;
10361 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10362 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10363 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10364 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10365 sampler_ci.mipLodBias = 1.0;
10366 sampler_ci.anisotropyEnable = VK_FALSE;
10367 sampler_ci.maxAnisotropy = 1;
10368 sampler_ci.compareEnable = VK_FALSE;
10369 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10370 sampler_ci.minLod = 1.0;
10371 sampler_ci.maxLod = 1.0;
10372 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10373 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010374
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010376 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010377 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010378
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010379 VkDescriptorImageInfo info = {};
10380 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010381
10382 VkWriteDescriptorSet descriptor_write;
10383 memset(&descriptor_write, 0, sizeof(descriptor_write));
10384 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010385 descriptor_write.dstSet = descriptorSet;
10386 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010387 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010388 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010389 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010390 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010391
10392 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10393
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010394 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010395
Chia-I Wuf7458c52015-10-26 21:10:41 +080010396 vkDestroySampler(m_device->device(), sampler, NULL);
10397 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10398 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010399}
10400
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010401TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10402 // Create layout w/ empty binding and attempt to update it
10403 VkResult err;
10404
Tony Barbour1fa09702017-03-16 12:09:08 -060010405 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010406
10407 VkDescriptorPoolSize ds_type_count = {};
10408 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10409 ds_type_count.descriptorCount = 1;
10410
10411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10413 ds_pool_ci.pNext = NULL;
10414 ds_pool_ci.maxSets = 1;
10415 ds_pool_ci.poolSizeCount = 1;
10416 ds_pool_ci.pPoolSizes = &ds_type_count;
10417
10418 VkDescriptorPool ds_pool;
10419 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10420 ASSERT_VK_SUCCESS(err);
10421
10422 VkDescriptorSetLayoutBinding dsl_binding = {};
10423 dsl_binding.binding = 0;
10424 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10425 dsl_binding.descriptorCount = 0;
10426 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10427 dsl_binding.pImmutableSamplers = NULL;
10428
10429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10430 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10431 ds_layout_ci.pNext = NULL;
10432 ds_layout_ci.bindingCount = 1;
10433 ds_layout_ci.pBindings = &dsl_binding;
10434 VkDescriptorSetLayout ds_layout;
10435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10436 ASSERT_VK_SUCCESS(err);
10437
10438 VkDescriptorSet descriptor_set;
10439 VkDescriptorSetAllocateInfo alloc_info = {};
10440 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10441 alloc_info.descriptorSetCount = 1;
10442 alloc_info.descriptorPool = ds_pool;
10443 alloc_info.pSetLayouts = &ds_layout;
10444 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10445 ASSERT_VK_SUCCESS(err);
10446
10447 VkSamplerCreateInfo sampler_ci = {};
10448 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10449 sampler_ci.magFilter = VK_FILTER_NEAREST;
10450 sampler_ci.minFilter = VK_FILTER_NEAREST;
10451 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10452 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10453 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10454 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10455 sampler_ci.mipLodBias = 1.0;
10456 sampler_ci.maxAnisotropy = 1;
10457 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10458 sampler_ci.minLod = 1.0;
10459 sampler_ci.maxLod = 1.0;
10460 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10461
10462 VkSampler sampler;
10463 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10464 ASSERT_VK_SUCCESS(err);
10465
10466 VkDescriptorImageInfo info = {};
10467 info.sampler = sampler;
10468
10469 VkWriteDescriptorSet descriptor_write;
10470 memset(&descriptor_write, 0, sizeof(descriptor_write));
10471 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10472 descriptor_write.dstSet = descriptor_set;
10473 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010474 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010475 // This is the wrong type, but empty binding error will be flagged first
10476 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10477 descriptor_write.pImageInfo = &info;
10478
10479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10481 m_errorMonitor->VerifyFound();
10482
10483 vkDestroySampler(m_device->device(), sampler, NULL);
10484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10486}
10487
Karl Schultz6addd812016-02-02 17:17:23 -070010488TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10489 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10490 // types
10491 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010493 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 -060010494
Tony Barbour1fa09702017-03-16 12:09:08 -060010495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010496
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010497 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010498 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10499 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010500
10501 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010502 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10503 ds_pool_ci.pNext = NULL;
10504 ds_pool_ci.maxSets = 1;
10505 ds_pool_ci.poolSizeCount = 1;
10506 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010507
Tobin Ehlis3b780662015-05-28 12:11:26 -060010508 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010509 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010510 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010511 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010512 dsl_binding.binding = 0;
10513 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10514 dsl_binding.descriptorCount = 1;
10515 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10516 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010517
Tony Barboureb254902015-07-15 12:50:33 -060010518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10520 ds_layout_ci.pNext = NULL;
10521 ds_layout_ci.bindingCount = 1;
10522 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010523
Tobin Ehlis3b780662015-05-28 12:11:26 -060010524 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010525 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010526 ASSERT_VK_SUCCESS(err);
10527
10528 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010529 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010531 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010532 alloc_info.descriptorPool = ds_pool;
10533 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010535 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010536
Tony Barboureb254902015-07-15 12:50:33 -060010537 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010538 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10539 sampler_ci.pNext = NULL;
10540 sampler_ci.magFilter = VK_FILTER_NEAREST;
10541 sampler_ci.minFilter = VK_FILTER_NEAREST;
10542 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10543 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10544 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10545 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10546 sampler_ci.mipLodBias = 1.0;
10547 sampler_ci.anisotropyEnable = VK_FALSE;
10548 sampler_ci.maxAnisotropy = 1;
10549 sampler_ci.compareEnable = VK_FALSE;
10550 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10551 sampler_ci.minLod = 1.0;
10552 sampler_ci.maxLod = 1.0;
10553 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10554 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010555 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010556 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010557 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010558
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010559 VkDescriptorImageInfo info = {};
10560 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010561
10562 VkWriteDescriptorSet descriptor_write;
10563 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010564 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010565 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010566 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010567 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010568 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010569 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010570
10571 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10572
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010573 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010574
Chia-I Wuf7458c52015-10-26 21:10:41 +080010575 vkDestroySampler(m_device->device(), sampler, NULL);
10576 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10577 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010578}
10579
Karl Schultz6addd812016-02-02 17:17:23 -070010580TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010581 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010582 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010583
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010585
Tony Barbour1fa09702017-03-16 12:09:08 -060010586 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010587 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10588 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010589 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010590 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10591 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010592
10593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10595 ds_pool_ci.pNext = NULL;
10596 ds_pool_ci.maxSets = 1;
10597 ds_pool_ci.poolSizeCount = 1;
10598 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010599
10600 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010601 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010602 ASSERT_VK_SUCCESS(err);
10603
10604 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010605 dsl_binding.binding = 0;
10606 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10607 dsl_binding.descriptorCount = 1;
10608 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10609 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010610
10611 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010612 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10613 ds_layout_ci.pNext = NULL;
10614 ds_layout_ci.bindingCount = 1;
10615 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010616 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010618 ASSERT_VK_SUCCESS(err);
10619
10620 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010621 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010622 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010623 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010624 alloc_info.descriptorPool = ds_pool;
10625 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010626 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010627 ASSERT_VK_SUCCESS(err);
10628
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010629 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010630
10631 VkDescriptorImageInfo descriptor_info;
10632 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10633 descriptor_info.sampler = sampler;
10634
10635 VkWriteDescriptorSet descriptor_write;
10636 memset(&descriptor_write, 0, sizeof(descriptor_write));
10637 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010638 descriptor_write.dstSet = descriptorSet;
10639 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010640 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010641 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10642 descriptor_write.pImageInfo = &descriptor_info;
10643
10644 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10645
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010646 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010647
Chia-I Wuf7458c52015-10-26 21:10:41 +080010648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010650}
10651
Karl Schultz6addd812016-02-02 17:17:23 -070010652TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10653 // Create a single combined Image/Sampler descriptor and send it an invalid
10654 // imageView
10655 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010658
Tony Barbour1fa09702017-03-16 12:09:08 -060010659 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010660 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010661 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10662 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010663
10664 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010665 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10666 ds_pool_ci.pNext = NULL;
10667 ds_pool_ci.maxSets = 1;
10668 ds_pool_ci.poolSizeCount = 1;
10669 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010670
10671 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010672 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010673 ASSERT_VK_SUCCESS(err);
10674
10675 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010676 dsl_binding.binding = 0;
10677 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10678 dsl_binding.descriptorCount = 1;
10679 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10680 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010681
10682 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010683 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10684 ds_layout_ci.pNext = NULL;
10685 ds_layout_ci.bindingCount = 1;
10686 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010687 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010688 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010689 ASSERT_VK_SUCCESS(err);
10690
10691 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010692 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010693 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010694 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010695 alloc_info.descriptorPool = ds_pool;
10696 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010697 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010698 ASSERT_VK_SUCCESS(err);
10699
10700 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010701 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10702 sampler_ci.pNext = NULL;
10703 sampler_ci.magFilter = VK_FILTER_NEAREST;
10704 sampler_ci.minFilter = VK_FILTER_NEAREST;
10705 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10706 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10707 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10708 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10709 sampler_ci.mipLodBias = 1.0;
10710 sampler_ci.anisotropyEnable = VK_FALSE;
10711 sampler_ci.maxAnisotropy = 1;
10712 sampler_ci.compareEnable = VK_FALSE;
10713 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10714 sampler_ci.minLod = 1.0;
10715 sampler_ci.maxLod = 1.0;
10716 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10717 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010718
10719 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010720 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010721 ASSERT_VK_SUCCESS(err);
10722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010723 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010724
10725 VkDescriptorImageInfo descriptor_info;
10726 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10727 descriptor_info.sampler = sampler;
10728 descriptor_info.imageView = view;
10729
10730 VkWriteDescriptorSet descriptor_write;
10731 memset(&descriptor_write, 0, sizeof(descriptor_write));
10732 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010733 descriptor_write.dstSet = descriptorSet;
10734 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010735 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010736 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10737 descriptor_write.pImageInfo = &descriptor_info;
10738
10739 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10740
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010741 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010742
Chia-I Wuf7458c52015-10-26 21:10:41 +080010743 vkDestroySampler(m_device->device(), sampler, NULL);
10744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010746}
10747
Karl Schultz6addd812016-02-02 17:17:23 -070010748TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10749 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10750 // into the other
10751 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010752
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10754 " binding #1 with type "
10755 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10756 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010757
Tony Barbour1fa09702017-03-16 12:09:08 -060010758 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010759 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010760 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010761 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10762 ds_type_count[0].descriptorCount = 1;
10763 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10764 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010765
10766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10768 ds_pool_ci.pNext = NULL;
10769 ds_pool_ci.maxSets = 1;
10770 ds_pool_ci.poolSizeCount = 2;
10771 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772
10773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010774 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010775 ASSERT_VK_SUCCESS(err);
10776 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010777 dsl_binding[0].binding = 0;
10778 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10779 dsl_binding[0].descriptorCount = 1;
10780 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10781 dsl_binding[0].pImmutableSamplers = NULL;
10782 dsl_binding[1].binding = 1;
10783 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10784 dsl_binding[1].descriptorCount = 1;
10785 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10786 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010787
10788 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010789 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10790 ds_layout_ci.pNext = NULL;
10791 ds_layout_ci.bindingCount = 2;
10792 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010793
10794 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010796 ASSERT_VK_SUCCESS(err);
10797
10798 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010799 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010801 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010802 alloc_info.descriptorPool = ds_pool;
10803 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010805 ASSERT_VK_SUCCESS(err);
10806
10807 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010808 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10809 sampler_ci.pNext = NULL;
10810 sampler_ci.magFilter = VK_FILTER_NEAREST;
10811 sampler_ci.minFilter = VK_FILTER_NEAREST;
10812 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10813 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10814 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10815 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10816 sampler_ci.mipLodBias = 1.0;
10817 sampler_ci.anisotropyEnable = VK_FALSE;
10818 sampler_ci.maxAnisotropy = 1;
10819 sampler_ci.compareEnable = VK_FALSE;
10820 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10821 sampler_ci.minLod = 1.0;
10822 sampler_ci.maxLod = 1.0;
10823 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10824 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010825
10826 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010827 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010828 ASSERT_VK_SUCCESS(err);
10829
10830 VkDescriptorImageInfo info = {};
10831 info.sampler = sampler;
10832
10833 VkWriteDescriptorSet descriptor_write;
10834 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010836 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010837 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010838 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10840 descriptor_write.pImageInfo = &info;
10841 // This write update should succeed
10842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10843 // Now perform a copy update that fails due to type mismatch
10844 VkCopyDescriptorSet copy_ds_update;
10845 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10846 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10847 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010848 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010849 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010850 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10851 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010854 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010856 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 -060010857 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10858 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10859 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010860 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010861 copy_ds_update.dstSet = descriptorSet;
10862 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010863 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010864 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10865
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010866 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010867
Tobin Ehlis04356f92015-10-27 16:35:27 -060010868 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10870 " binding#1 with offset index of 1 plus "
10871 "update array offset of 0 and update of "
10872 "5 descriptors oversteps total number "
10873 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010874
Tobin Ehlis04356f92015-10-27 16:35:27 -060010875 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10876 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10877 copy_ds_update.srcSet = descriptorSet;
10878 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010879 copy_ds_update.dstSet = descriptorSet;
10880 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010881 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010882 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10883
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010884 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010885
Chia-I Wuf7458c52015-10-26 21:10:41 +080010886 vkDestroySampler(m_device->device(), sampler, NULL);
10887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010889}
10890
Karl Schultz6addd812016-02-02 17:17:23 -070010891TEST_F(VkLayerTest, NumSamplesMismatch) {
10892 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10893 // sampleCount
10894 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010897
Tony Barbour1fa09702017-03-16 12:09:08 -060010898 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010899 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010900 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010901 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010902 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010903
10904 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010905 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10906 ds_pool_ci.pNext = NULL;
10907 ds_pool_ci.maxSets = 1;
10908 ds_pool_ci.poolSizeCount = 1;
10909 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010910
Tobin Ehlis3b780662015-05-28 12:11:26 -060010911 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010913 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010914
Tony Barboureb254902015-07-15 12:50:33 -060010915 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010916 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010917 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010918 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010919 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10920 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010921
Tony Barboureb254902015-07-15 12:50:33 -060010922 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10923 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10924 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010925 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010926 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010927
Tobin Ehlis3b780662015-05-28 12:11:26 -060010928 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010929 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010930 ASSERT_VK_SUCCESS(err);
10931
10932 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010933 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010934 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010935 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010936 alloc_info.descriptorPool = ds_pool;
10937 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939 ASSERT_VK_SUCCESS(err);
10940
Tony Barboureb254902015-07-15 12:50:33 -060010941 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010943 pipe_ms_state_ci.pNext = NULL;
10944 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10945 pipe_ms_state_ci.sampleShadingEnable = 0;
10946 pipe_ms_state_ci.minSampleShading = 1.0;
10947 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010948
Tony Barboureb254902015-07-15 12:50:33 -060010949 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010950 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10951 pipeline_layout_ci.pNext = NULL;
10952 pipeline_layout_ci.setLayoutCount = 1;
10953 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010954
10955 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010956 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010957 ASSERT_VK_SUCCESS(err);
10958
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010959 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010960 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 -060010961 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010962 VkPipelineObj pipe(m_device);
10963 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010964 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010965 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010966 pipe.SetMSAA(&pipe_ms_state_ci);
10967 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010968
Tony Barbour552f6c02016-12-21 14:34:07 -070010969 m_commandBuffer->BeginCommandBuffer();
10970 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010972
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010973 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10974 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10975 VkRect2D scissor = {{0, 0}, {16, 16}};
10976 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10977
Mark Young29927482016-05-04 14:38:51 -060010978 // Render triangle (the error should trigger on the attempt to draw).
10979 Draw(3, 1, 0, 0);
10980
10981 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010982 m_commandBuffer->EndRenderPass();
10983 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010984
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010985 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010986
Chia-I Wuf7458c52015-10-26 21:10:41 +080010987 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10989 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010990}
Mark Young29927482016-05-04 14:38:51 -060010991
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010992TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010993 TEST_DESCRIPTION(
10994 "Hit RenderPass incompatible cases. "
10995 "Initial case is drawing with an active renderpass that's "
10996 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010997 VkResult err;
10998
Tony Barbour1fa09702017-03-16 12:09:08 -060010999 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11001
11002 VkDescriptorSetLayoutBinding dsl_binding = {};
11003 dsl_binding.binding = 0;
11004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11005 dsl_binding.descriptorCount = 1;
11006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11007 dsl_binding.pImmutableSamplers = NULL;
11008
11009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11011 ds_layout_ci.pNext = NULL;
11012 ds_layout_ci.bindingCount = 1;
11013 ds_layout_ci.pBindings = &dsl_binding;
11014
11015 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011016 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011017 ASSERT_VK_SUCCESS(err);
11018
11019 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11020 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11021 pipeline_layout_ci.pNext = NULL;
11022 pipeline_layout_ci.setLayoutCount = 1;
11023 pipeline_layout_ci.pSetLayouts = &ds_layout;
11024
11025 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011027 ASSERT_VK_SUCCESS(err);
11028
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011029 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011030 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 -060011031 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011032 // Create a renderpass that will be incompatible with default renderpass
11033 VkAttachmentReference attach = {};
11034 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11035 VkAttachmentReference color_att = {};
11036 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11037 VkSubpassDescription subpass = {};
11038 subpass.inputAttachmentCount = 1;
11039 subpass.pInputAttachments = &attach;
11040 subpass.colorAttachmentCount = 1;
11041 subpass.pColorAttachments = &color_att;
11042 VkRenderPassCreateInfo rpci = {};
11043 rpci.subpassCount = 1;
11044 rpci.pSubpasses = &subpass;
11045 rpci.attachmentCount = 1;
11046 VkAttachmentDescription attach_desc = {};
11047 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011048 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11049 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011050 rpci.pAttachments = &attach_desc;
11051 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11052 VkRenderPass rp;
11053 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11054 VkPipelineObj pipe(m_device);
11055 pipe.AddShader(&vs);
11056 pipe.AddShader(&fs);
11057 pipe.AddColorAttachment();
11058 VkViewport view_port = {};
11059 m_viewports.push_back(view_port);
11060 pipe.SetViewport(m_viewports);
11061 VkRect2D rect = {};
11062 m_scissors.push_back(rect);
11063 pipe.SetScissor(m_scissors);
11064 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11065
11066 VkCommandBufferInheritanceInfo cbii = {};
11067 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11068 cbii.renderPass = rp;
11069 cbii.subpass = 0;
11070 VkCommandBufferBeginInfo cbbi = {};
11071 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11072 cbbi.pInheritanceInfo = &cbii;
11073 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11074 VkRenderPassBeginInfo rpbi = {};
11075 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11076 rpbi.framebuffer = m_framebuffer;
11077 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011078 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11079 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011082 // Render triangle (the error should trigger on the attempt to draw).
11083 Draw(3, 1, 0, 0);
11084
11085 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011086 m_commandBuffer->EndRenderPass();
11087 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011088
11089 m_errorMonitor->VerifyFound();
11090
11091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11092 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11093 vkDestroyRenderPass(m_device->device(), rp, NULL);
11094}
11095
Mark Youngc89c6312016-03-31 16:03:20 -060011096TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11097 // Create Pipeline where the number of blend attachments doesn't match the
11098 // number of color attachments. In this case, we don't add any color
11099 // blend attachments even though we have a color attachment.
11100 VkResult err;
11101
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011103
Tony Barbour1fa09702017-03-16 12:09:08 -060011104 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11106 VkDescriptorPoolSize ds_type_count = {};
11107 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11108 ds_type_count.descriptorCount = 1;
11109
11110 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11111 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11112 ds_pool_ci.pNext = NULL;
11113 ds_pool_ci.maxSets = 1;
11114 ds_pool_ci.poolSizeCount = 1;
11115 ds_pool_ci.pPoolSizes = &ds_type_count;
11116
11117 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011119 ASSERT_VK_SUCCESS(err);
11120
11121 VkDescriptorSetLayoutBinding dsl_binding = {};
11122 dsl_binding.binding = 0;
11123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11124 dsl_binding.descriptorCount = 1;
11125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11126 dsl_binding.pImmutableSamplers = NULL;
11127
11128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11130 ds_layout_ci.pNext = NULL;
11131 ds_layout_ci.bindingCount = 1;
11132 ds_layout_ci.pBindings = &dsl_binding;
11133
11134 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011136 ASSERT_VK_SUCCESS(err);
11137
11138 VkDescriptorSet descriptorSet;
11139 VkDescriptorSetAllocateInfo alloc_info = {};
11140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11141 alloc_info.descriptorSetCount = 1;
11142 alloc_info.descriptorPool = ds_pool;
11143 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011145 ASSERT_VK_SUCCESS(err);
11146
11147 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011149 pipe_ms_state_ci.pNext = NULL;
11150 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11151 pipe_ms_state_ci.sampleShadingEnable = 0;
11152 pipe_ms_state_ci.minSampleShading = 1.0;
11153 pipe_ms_state_ci.pSampleMask = NULL;
11154
11155 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11156 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11157 pipeline_layout_ci.pNext = NULL;
11158 pipeline_layout_ci.setLayoutCount = 1;
11159 pipeline_layout_ci.pSetLayouts = &ds_layout;
11160
11161 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011163 ASSERT_VK_SUCCESS(err);
11164
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011165 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011166 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 -060011167 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011168 VkPipelineObj pipe(m_device);
11169 pipe.AddShader(&vs);
11170 pipe.AddShader(&fs);
11171 pipe.SetMSAA(&pipe_ms_state_ci);
11172 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011173 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011174
11175 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11176 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11177 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11178}
Mark Young29927482016-05-04 14:38:51 -060011179
Mark Muellerd4914412016-06-13 17:52:06 -060011180TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011181 TEST_DESCRIPTION(
11182 "Points to a wrong colorAttachment index in a VkClearAttachment "
11183 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011184 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011186
11187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11188 m_errorMonitor->VerifyFound();
11189}
11190
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011191TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011192 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11193 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011194
Tony Barbour1fa09702017-03-16 12:09:08 -060011195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011197
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011198 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011199 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11200 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011201
11202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11204 ds_pool_ci.pNext = NULL;
11205 ds_pool_ci.maxSets = 1;
11206 ds_pool_ci.poolSizeCount = 1;
11207 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011208
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011209 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011211 ASSERT_VK_SUCCESS(err);
11212
Tony Barboureb254902015-07-15 12:50:33 -060011213 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011214 dsl_binding.binding = 0;
11215 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11216 dsl_binding.descriptorCount = 1;
11217 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11218 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011219
Tony Barboureb254902015-07-15 12:50:33 -060011220 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011221 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11222 ds_layout_ci.pNext = NULL;
11223 ds_layout_ci.bindingCount = 1;
11224 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011225
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011226 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011228 ASSERT_VK_SUCCESS(err);
11229
11230 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011231 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011232 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011233 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011234 alloc_info.descriptorPool = ds_pool;
11235 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011236 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011237 ASSERT_VK_SUCCESS(err);
11238
Tony Barboureb254902015-07-15 12:50:33 -060011239 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011240 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011241 pipe_ms_state_ci.pNext = NULL;
11242 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11243 pipe_ms_state_ci.sampleShadingEnable = 0;
11244 pipe_ms_state_ci.minSampleShading = 1.0;
11245 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011246
Tony Barboureb254902015-07-15 12:50:33 -060011247 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011248 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11249 pipeline_layout_ci.pNext = NULL;
11250 pipeline_layout_ci.setLayoutCount = 1;
11251 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011252
11253 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011255 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011257 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011258 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011259 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011260 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011261
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011262 VkPipelineObj pipe(m_device);
11263 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011264 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011265 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011266 pipe.SetMSAA(&pipe_ms_state_ci);
11267 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011268
Tony Barbour552f6c02016-12-21 14:34:07 -070011269 m_commandBuffer->BeginCommandBuffer();
11270 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011271
Karl Schultz6addd812016-02-02 17:17:23 -070011272 // Main thing we care about for this test is that the VkImage obj we're
11273 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011274 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011275 VkClearAttachment color_attachment;
11276 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11277 color_attachment.clearValue.color.float32[0] = 1.0;
11278 color_attachment.clearValue.color.float32[1] = 1.0;
11279 color_attachment.clearValue.color.float32[2] = 1.0;
11280 color_attachment.clearValue.color.float32[3] = 1.0;
11281 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011282 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011283
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011284 // Call for full-sized FB Color attachment prior to issuing a Draw
11285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011286 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011287 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011288 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011289
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011290 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11291 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11293 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11294 m_errorMonitor->VerifyFound();
11295
11296 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11297 clear_rect.layerCount = 2;
11298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11299 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011300 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011301
Chia-I Wuf7458c52015-10-26 21:10:41 +080011302 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11303 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11304 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011305}
11306
Karl Schultz6addd812016-02-02 17:17:23 -070011307TEST_F(VkLayerTest, VtxBufferBadIndex) {
11308 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011309
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11311 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011312
Tony Barbour1fa09702017-03-16 12:09:08 -060011313 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011314 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011316
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011317 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011318 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11319 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011320
11321 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011322 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11323 ds_pool_ci.pNext = NULL;
11324 ds_pool_ci.maxSets = 1;
11325 ds_pool_ci.poolSizeCount = 1;
11326 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011327
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011328 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011329 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011330 ASSERT_VK_SUCCESS(err);
11331
Tony Barboureb254902015-07-15 12:50:33 -060011332 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011333 dsl_binding.binding = 0;
11334 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11335 dsl_binding.descriptorCount = 1;
11336 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11337 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011338
Tony Barboureb254902015-07-15 12:50:33 -060011339 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011340 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11341 ds_layout_ci.pNext = NULL;
11342 ds_layout_ci.bindingCount = 1;
11343 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011344
Tobin Ehlis502480b2015-06-24 15:53:07 -060011345 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011347 ASSERT_VK_SUCCESS(err);
11348
11349 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011350 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011351 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011352 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011353 alloc_info.descriptorPool = ds_pool;
11354 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011356 ASSERT_VK_SUCCESS(err);
11357
Tony Barboureb254902015-07-15 12:50:33 -060011358 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011359 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011360 pipe_ms_state_ci.pNext = NULL;
11361 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11362 pipe_ms_state_ci.sampleShadingEnable = 0;
11363 pipe_ms_state_ci.minSampleShading = 1.0;
11364 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011365
Tony Barboureb254902015-07-15 12:50:33 -060011366 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011367 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11368 pipeline_layout_ci.pNext = NULL;
11369 pipeline_layout_ci.setLayoutCount = 1;
11370 pipeline_layout_ci.pSetLayouts = &ds_layout;
11371 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011374 ASSERT_VK_SUCCESS(err);
11375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011376 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 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 -060011378 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011379 VkPipelineObj pipe(m_device);
11380 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011381 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011382 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011383 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011384 pipe.SetViewport(m_viewports);
11385 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011386 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011387
Tony Barbour552f6c02016-12-21 14:34:07 -070011388 m_commandBuffer->BeginCommandBuffer();
11389 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011390 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011391 // Don't care about actual data, just need to get to draw to flag error
11392 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011393 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011394 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011395 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011396
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011397 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011398
Chia-I Wuf7458c52015-10-26 21:10:41 +080011399 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11401 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011402}
Mark Muellerdfe37552016-07-07 14:47:42 -060011403
Mark Mueller2ee294f2016-08-04 12:59:48 -060011404TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011405 TEST_DESCRIPTION(
11406 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11407 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011408 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011409
Mark Mueller880fce52016-08-17 15:23:23 -060011410 // The following test fails with recent NVidia drivers.
11411 // By the time core_validation is reached, the NVidia
11412 // driver has sanitized the invalid condition and core_validation
11413 // is not introduced to the failure condition. This is not the case
11414 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011415 // uint32_t count = static_cast<uint32_t>(~0);
11416 // VkPhysicalDevice physical_device;
11417 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11418 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011419
Mark Mueller2ee294f2016-08-04 12:59:48 -060011420 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011421 VkDeviceQueueCreateInfo queue_create_info = {};
11422 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11423 queue_create_info.queueCount = 1;
11424 queue_create_info.pQueuePriorities = &queue_priority;
11425 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11426
11427 VkPhysicalDeviceFeatures features = m_device->phy().features();
11428 VkDevice testDevice;
11429 VkDeviceCreateInfo device_create_info = {};
11430 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11431 device_create_info.queueCreateInfoCount = 1;
11432 device_create_info.pQueueCreateInfos = &queue_create_info;
11433 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011434
11435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11436 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011437 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11438 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11439 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011440 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11441 m_errorMonitor->VerifyFound();
11442
11443 queue_create_info.queueFamilyIndex = 1;
11444
11445 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11446 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11447 for (unsigned i = 0; i < feature_count; i++) {
11448 if (VK_FALSE == feature_array[i]) {
11449 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011450 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11452 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011453 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11454 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11455 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11457 "You requested features that are unavailable on this device. You should first "
11458 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011459 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11460 m_errorMonitor->VerifyFound();
11461 break;
11462 }
11463 }
11464}
11465
Tobin Ehlis16edf082016-11-21 12:33:49 -070011466TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11467 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11468
Tony Barbour1fa09702017-03-16 12:09:08 -060011469 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011470
11471 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11472 std::vector<VkDeviceQueueCreateInfo> queue_info;
11473 queue_info.reserve(queue_props.size());
11474 std::vector<std::vector<float>> queue_priorities;
11475 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11476 VkDeviceQueueCreateInfo qi{};
11477 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11478 qi.queueFamilyIndex = i;
11479 qi.queueCount = queue_props[i].queueCount;
11480 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11481 qi.pQueuePriorities = queue_priorities[i].data();
11482 queue_info.push_back(qi);
11483 }
11484
11485 std::vector<const char *> device_extension_names;
11486
11487 VkDevice local_device;
11488 VkDeviceCreateInfo device_create_info = {};
11489 auto features = m_device->phy().features();
11490 // Intentionally disable pipeline stats
11491 features.pipelineStatisticsQuery = VK_FALSE;
11492 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11493 device_create_info.pNext = NULL;
11494 device_create_info.queueCreateInfoCount = queue_info.size();
11495 device_create_info.pQueueCreateInfos = queue_info.data();
11496 device_create_info.enabledLayerCount = 0;
11497 device_create_info.ppEnabledLayerNames = NULL;
11498 device_create_info.pEnabledFeatures = &features;
11499 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11500 ASSERT_VK_SUCCESS(err);
11501
11502 VkQueryPoolCreateInfo qpci{};
11503 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11504 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11505 qpci.queryCount = 1;
11506 VkQueryPool query_pool;
11507
11508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11509 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11510 m_errorMonitor->VerifyFound();
11511
11512 vkDestroyDevice(local_device, nullptr);
11513}
11514
Mark Mueller2ee294f2016-08-04 12:59:48 -060011515TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011516 TEST_DESCRIPTION(
11517 "Use an invalid queue index in a vkCmdWaitEvents call."
11518 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011519
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011520 const char *invalid_queue_index =
11521 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11522 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11523 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011524
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011525 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011526
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011528
Tony Barbour1fa09702017-03-16 12:09:08 -060011529 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011530
11531 VkEvent event;
11532 VkEventCreateInfo event_create_info{};
11533 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11534 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11535
Mark Mueller2ee294f2016-08-04 12:59:48 -060011536 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011537 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011538
Tony Barbour552f6c02016-12-21 14:34:07 -070011539 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011540
11541 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011542 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 -060011543 ASSERT_TRUE(image.initialized());
11544 VkImageMemoryBarrier img_barrier = {};
11545 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11546 img_barrier.pNext = NULL;
11547 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11548 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11549 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11550 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11551 img_barrier.image = image.handle();
11552 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011553
11554 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11555 // that layer validation catches the case when it is not.
11556 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011557 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11558 img_barrier.subresourceRange.baseArrayLayer = 0;
11559 img_barrier.subresourceRange.baseMipLevel = 0;
11560 img_barrier.subresourceRange.layerCount = 1;
11561 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11563 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011564 m_errorMonitor->VerifyFound();
11565
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011567
11568 VkQueryPool query_pool;
11569 VkQueryPoolCreateInfo query_pool_create_info = {};
11570 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11571 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11572 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011573 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011574
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011575 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011576 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11577
11578 vkEndCommandBuffer(m_commandBuffer->handle());
11579 m_errorMonitor->VerifyFound();
11580
11581 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11582 vkDestroyEvent(m_device->device(), event, nullptr);
11583}
11584
Mark Muellerdfe37552016-07-07 14:47:42 -060011585TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011586 TEST_DESCRIPTION(
11587 "Submit a command buffer using deleted vertex buffer, "
11588 "delete a buffer twice, use an invalid offset for each "
11589 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011590
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011591 const char *deleted_buffer_in_command_buffer =
11592 "Cannot submit cmd buffer "
11593 "using deleted buffer ";
11594 const char *invalid_offset_message =
11595 "vkBindBufferMemory(): "
11596 "memoryOffset is 0x";
11597 const char *invalid_storage_buffer_offset_message =
11598 "vkBindBufferMemory(): "
11599 "storage memoryOffset "
11600 "is 0x";
11601 const char *invalid_texel_buffer_offset_message =
11602 "vkBindBufferMemory(): "
11603 "texel memoryOffset "
11604 "is 0x";
11605 const char *invalid_uniform_buffer_offset_message =
11606 "vkBindBufferMemory(): "
11607 "uniform memoryOffset "
11608 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011609
Tony Barbour1fa09702017-03-16 12:09:08 -060011610 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011611 ASSERT_NO_FATAL_FAILURE(InitViewport());
11612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11613
11614 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011616 pipe_ms_state_ci.pNext = NULL;
11617 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11618 pipe_ms_state_ci.sampleShadingEnable = 0;
11619 pipe_ms_state_ci.minSampleShading = 1.0;
11620 pipe_ms_state_ci.pSampleMask = nullptr;
11621
11622 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11623 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11624 VkPipelineLayout pipeline_layout;
11625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011626 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011627 ASSERT_VK_SUCCESS(err);
11628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11630 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011631 VkPipelineObj pipe(m_device);
11632 pipe.AddShader(&vs);
11633 pipe.AddShader(&fs);
11634 pipe.AddColorAttachment();
11635 pipe.SetMSAA(&pipe_ms_state_ci);
11636 pipe.SetViewport(m_viewports);
11637 pipe.SetScissor(m_scissors);
11638 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11639
Tony Barbour552f6c02016-12-21 14:34:07 -070011640 m_commandBuffer->BeginCommandBuffer();
11641 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011642 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011643
11644 {
11645 // Create and bind a vertex buffer in a reduced scope, which will cause
11646 // it to be deleted upon leaving this scope
11647 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011649 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11650 draw_verticies.AddVertexInputToPipe(pipe);
11651 }
11652
11653 Draw(1, 0, 0, 0);
11654
Tony Barbour552f6c02016-12-21 14:34:07 -070011655 m_commandBuffer->EndRenderPass();
11656 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011657
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011659 QueueCommandBuffer(false);
11660 m_errorMonitor->VerifyFound();
11661
11662 {
11663 // Create and bind a vertex buffer in a reduced scope, and delete it
11664 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011665 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011667 buffer_test.TestDoubleDestroy();
11668 }
11669 m_errorMonitor->VerifyFound();
11670
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011671 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011672 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011673 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011675 m_errorMonitor->SetUnexpectedError(
11676 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11677 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11679 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011680 m_errorMonitor->VerifyFound();
11681 }
11682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011683 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11684 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011685 // Create and bind a memory buffer with an invalid offset again,
11686 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011688 m_errorMonitor->SetUnexpectedError(
11689 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11690 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011691 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11692 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011693 m_errorMonitor->VerifyFound();
11694 }
11695
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011696 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011697 // Create and bind a memory buffer with an invalid offset again, but
11698 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011700 m_errorMonitor->SetUnexpectedError(
11701 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11702 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011703 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11704 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011705 m_errorMonitor->VerifyFound();
11706 }
11707
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011708 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011709 // Create and bind a memory buffer with an invalid offset again, but
11710 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011712 m_errorMonitor->SetUnexpectedError(
11713 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11714 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011715 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11716 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011717 m_errorMonitor->VerifyFound();
11718 }
11719
11720 {
11721 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011723 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11724 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011725 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11726 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011727 m_errorMonitor->VerifyFound();
11728 }
11729
11730 {
11731 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011733 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11734 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011735 }
11736 m_errorMonitor->VerifyFound();
11737
11738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11739}
11740
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011741// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11742TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011743 TEST_DESCRIPTION(
11744 "Hit all possible validation checks associated with the "
11745 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11746 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011747 // 3 in ValidateCmdBufImageLayouts
11748 // * -1 Attempt to submit cmd buf w/ deleted image
11749 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11750 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011751
Tony Barbour1fa09702017-03-16 12:09:08 -060011752 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011753 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011754 if (!depth_format) {
11755 printf(" No Depth + Stencil format found. Skipped.\n");
11756 return;
11757 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011758 // Create src & dst images to use for copy operations
11759 VkImage src_image;
11760 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011761 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011762
11763 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11764 const int32_t tex_width = 32;
11765 const int32_t tex_height = 32;
11766
11767 VkImageCreateInfo image_create_info = {};
11768 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11769 image_create_info.pNext = NULL;
11770 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11771 image_create_info.format = tex_format;
11772 image_create_info.extent.width = tex_width;
11773 image_create_info.extent.height = tex_height;
11774 image_create_info.extent.depth = 1;
11775 image_create_info.mipLevels = 1;
11776 image_create_info.arrayLayers = 4;
11777 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11778 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11779 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011780 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011781 image_create_info.flags = 0;
11782
11783 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11784 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011785 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011786 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11787 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011788 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11789 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11790 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11791 ASSERT_VK_SUCCESS(err);
11792
11793 // Allocate memory
11794 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011795 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011796 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011797 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11798 mem_alloc.pNext = NULL;
11799 mem_alloc.allocationSize = 0;
11800 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011801
11802 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011803 mem_alloc.allocationSize = img_mem_reqs.size;
11804 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011805 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011806 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011807 ASSERT_VK_SUCCESS(err);
11808
11809 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011810 mem_alloc.allocationSize = img_mem_reqs.size;
11811 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011812 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011813 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011814 ASSERT_VK_SUCCESS(err);
11815
11816 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011817 mem_alloc.allocationSize = img_mem_reqs.size;
11818 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011819 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011820 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011821 ASSERT_VK_SUCCESS(err);
11822
11823 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11824 ASSERT_VK_SUCCESS(err);
11825 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11826 ASSERT_VK_SUCCESS(err);
11827 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11828 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011829
Tony Barbour552f6c02016-12-21 14:34:07 -070011830 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011831 VkImageCopy copy_region;
11832 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11833 copy_region.srcSubresource.mipLevel = 0;
11834 copy_region.srcSubresource.baseArrayLayer = 0;
11835 copy_region.srcSubresource.layerCount = 1;
11836 copy_region.srcOffset.x = 0;
11837 copy_region.srcOffset.y = 0;
11838 copy_region.srcOffset.z = 0;
11839 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11840 copy_region.dstSubresource.mipLevel = 0;
11841 copy_region.dstSubresource.baseArrayLayer = 0;
11842 copy_region.dstSubresource.layerCount = 1;
11843 copy_region.dstOffset.x = 0;
11844 copy_region.dstOffset.y = 0;
11845 copy_region.dstOffset.z = 0;
11846 copy_region.extent.width = 1;
11847 copy_region.extent.height = 1;
11848 copy_region.extent.depth = 1;
11849
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11851 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11852 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011853
Cort530cf382016-12-08 09:59:47 -080011854 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 -060011855 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011856 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11857 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11859 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011860 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 -060011861 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011863 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11864 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060011865 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011866 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 -060011867 m_errorMonitor->VerifyFound();
11868 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011870 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011871 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011872 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011873 "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 -080011874 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 -060011875 m_errorMonitor->VerifyFound();
11876 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11878 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11879 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011880 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 -060011881 m_errorMonitor->VerifyFound();
11882 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011884 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011885 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011886 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011887 "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 -080011888 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 -060011889 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011891 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11892 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011893 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011894 "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 -080011895 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 -060011896 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011897
Cort3b021012016-12-07 12:00:57 -080011898 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11899 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11900 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11901 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11902 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11903 transfer_dst_image_barrier[0].srcAccessMask = 0;
11904 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11905 transfer_dst_image_barrier[0].image = dst_image;
11906 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11907 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11908 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11909 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11910 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11911 transfer_dst_image_barrier[0].image = depth_image;
11912 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11913 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11914 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11915
11916 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011917 VkClearColorValue color_clear_value = {};
11918 VkImageSubresourceRange clear_range;
11919 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11920 clear_range.baseMipLevel = 0;
11921 clear_range.baseArrayLayer = 0;
11922 clear_range.layerCount = 1;
11923 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011924
Cort3b021012016-12-07 12:00:57 -080011925 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11926 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011929 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011930 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011931 // Fail due to provided layout not matching actual current layout for color clear.
11932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011933 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011934 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011935
Cort530cf382016-12-08 09:59:47 -080011936 VkClearDepthStencilValue depth_clear_value = {};
11937 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011938
11939 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11940 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011943 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011944 m_errorMonitor->VerifyFound();
11945 // Fail due to provided layout not matching actual current layout for depth clear.
11946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011947 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011948 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011949
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011950 // Now cause error due to bad image layout transition in PipelineBarrier
11951 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011952 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011953 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011954 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011955 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011956 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11957 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011960 "you cannot transition the layout of aspect 1 from "
11961 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11962 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011964 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11965 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011966 m_errorMonitor->VerifyFound();
11967
11968 // Finally some layout errors at RenderPass create time
11969 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11970 VkAttachmentReference attach = {};
11971 // perf warning for GENERAL layout w/ non-DS input attachment
11972 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11973 VkSubpassDescription subpass = {};
11974 subpass.inputAttachmentCount = 1;
11975 subpass.pInputAttachments = &attach;
11976 VkRenderPassCreateInfo rpci = {};
11977 rpci.subpassCount = 1;
11978 rpci.pSubpasses = &subpass;
11979 rpci.attachmentCount = 1;
11980 VkAttachmentDescription attach_desc = {};
11981 attach_desc.format = VK_FORMAT_UNDEFINED;
11982 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011983 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011984 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11986 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011987 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11988 m_errorMonitor->VerifyFound();
11989 // error w/ non-general layout
11990 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11991
11992 m_errorMonitor->SetDesiredFailureMsg(
11993 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11994 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11995 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11996 m_errorMonitor->VerifyFound();
11997 subpass.inputAttachmentCount = 0;
11998 subpass.colorAttachmentCount = 1;
11999 subpass.pColorAttachments = &attach;
12000 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12001 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12003 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012004 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12005 m_errorMonitor->VerifyFound();
12006 // error w/ non-color opt or GENERAL layout for color attachment
12007 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12008 m_errorMonitor->SetDesiredFailureMsg(
12009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12010 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12011 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12012 m_errorMonitor->VerifyFound();
12013 subpass.colorAttachmentCount = 0;
12014 subpass.pDepthStencilAttachment = &attach;
12015 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12016 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12018 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12020 m_errorMonitor->VerifyFound();
12021 // error w/ non-ds opt or GENERAL layout for color attachment
12022 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12024 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12025 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012026 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12027 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012028 // For this error we need a valid renderpass so create default one
12029 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12030 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012031 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012032 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12033 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12034 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12035 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12036 // Can't do a CLEAR load on READ_ONLY initialLayout
12037 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12038 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12039 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012041 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012042 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12043 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012044
Cort3b021012016-12-07 12:00:57 -080012045 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12046 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12047 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012048 vkDestroyImage(m_device->device(), src_image, NULL);
12049 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012050 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012051}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012052
Tobin Ehlise0936662016-10-11 08:10:51 -060012053TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12054 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12055 VkResult err;
12056
Tony Barbour1fa09702017-03-16 12:09:08 -060012057 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012058
12059 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12060 VkImageTiling tiling;
12061 VkFormatProperties format_properties;
12062 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12063 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12064 tiling = VK_IMAGE_TILING_LINEAR;
12065 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12066 tiling = VK_IMAGE_TILING_OPTIMAL;
12067 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012068 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012069 return;
12070 }
12071
12072 VkDescriptorPoolSize ds_type = {};
12073 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12074 ds_type.descriptorCount = 1;
12075
12076 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12077 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12078 ds_pool_ci.maxSets = 1;
12079 ds_pool_ci.poolSizeCount = 1;
12080 ds_pool_ci.pPoolSizes = &ds_type;
12081 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12082
12083 VkDescriptorPool ds_pool;
12084 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12085 ASSERT_VK_SUCCESS(err);
12086
12087 VkDescriptorSetLayoutBinding dsl_binding = {};
12088 dsl_binding.binding = 0;
12089 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12090 dsl_binding.descriptorCount = 1;
12091 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12092 dsl_binding.pImmutableSamplers = NULL;
12093
12094 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12095 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12096 ds_layout_ci.pNext = NULL;
12097 ds_layout_ci.bindingCount = 1;
12098 ds_layout_ci.pBindings = &dsl_binding;
12099
12100 VkDescriptorSetLayout ds_layout;
12101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12102 ASSERT_VK_SUCCESS(err);
12103
12104 VkDescriptorSetAllocateInfo alloc_info = {};
12105 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12106 alloc_info.descriptorSetCount = 1;
12107 alloc_info.descriptorPool = ds_pool;
12108 alloc_info.pSetLayouts = &ds_layout;
12109 VkDescriptorSet descriptor_set;
12110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12111 ASSERT_VK_SUCCESS(err);
12112
12113 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12114 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12115 pipeline_layout_ci.pNext = NULL;
12116 pipeline_layout_ci.setLayoutCount = 1;
12117 pipeline_layout_ci.pSetLayouts = &ds_layout;
12118 VkPipelineLayout pipeline_layout;
12119 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12120 ASSERT_VK_SUCCESS(err);
12121
12122 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012123 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012124 ASSERT_TRUE(image.initialized());
12125 VkImageView view = image.targetView(tex_format);
12126
12127 VkDescriptorImageInfo image_info = {};
12128 image_info.imageView = view;
12129 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12130
12131 VkWriteDescriptorSet descriptor_write = {};
12132 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12133 descriptor_write.dstSet = descriptor_set;
12134 descriptor_write.dstBinding = 0;
12135 descriptor_write.descriptorCount = 1;
12136 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12137 descriptor_write.pImageInfo = &image_info;
12138
12139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12140 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12141 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12142 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12143 m_errorMonitor->VerifyFound();
12144
12145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12147 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12149}
12150
Mark Mueller93b938f2016-08-18 10:27:40 -060012151TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012152 TEST_DESCRIPTION(
12153 "Use vkCmdExecuteCommands with invalid state "
12154 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012155
Tony Barbour1fa09702017-03-16 12:09:08 -060012156 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12158
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012159 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012160 const char *simultaneous_use_message2 =
12161 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12162 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012163
12164 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012165 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012166 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012167 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12168 command_buffer_allocate_info.commandBufferCount = 1;
12169
12170 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012171 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012172 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12173 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012174 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012175 command_buffer_inheritance_info.renderPass = m_renderPass;
12176 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012177
Mark Mueller93b938f2016-08-18 10:27:40 -060012178 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012179 command_buffer_begin_info.flags =
12180 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012181 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12182
12183 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12184 vkEndCommandBuffer(secondary_command_buffer);
12185
Mark Mueller93b938f2016-08-18 10:27:40 -060012186 VkSubmitInfo submit_info = {};
12187 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12188 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012189 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012190
Mark Mueller4042b652016-09-05 22:52:21 -060012191 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012192 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12194 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012195 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012196 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012197 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12198 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012199
Dave Houltonfbf52152017-01-06 12:55:29 -070012200 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012201 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012202 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012203
Mark Mueller4042b652016-09-05 22:52:21 -060012204 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012205 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012206 m_errorMonitor->SetUnexpectedError(
12207 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12208 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012209 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012210 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012211
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12213 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012214 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012215 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12216 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012217
12218 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012219
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012220 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012221}
12222
Tony Barbour626994c2017-02-08 15:29:37 -070012223TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12224 TEST_DESCRIPTION(
12225 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12226 "errors");
12227 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12228 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 -060012229 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012230
12231 VkCommandBuffer cmd_bufs[2];
12232 VkCommandBufferAllocateInfo alloc_info;
12233 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12234 alloc_info.pNext = NULL;
12235 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012236 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012237 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12238 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12239
12240 VkCommandBufferBeginInfo cb_binfo;
12241 cb_binfo.pNext = NULL;
12242 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12243 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12244 cb_binfo.flags = 0;
12245 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12246 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12247 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12248 vkEndCommandBuffer(cmd_bufs[0]);
12249 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12250
12251 VkSubmitInfo submit_info = {};
12252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12253 submit_info.commandBufferCount = 2;
12254 submit_info.pCommandBuffers = duplicates;
12255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12256 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12257 m_errorMonitor->VerifyFound();
12258 vkQueueWaitIdle(m_device->m_queue);
12259
12260 // Set one time use and now look for one time submit
12261 duplicates[0] = duplicates[1] = cmd_bufs[1];
12262 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12263 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12264 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12265 vkEndCommandBuffer(cmd_bufs[1]);
12266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12267 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12268 m_errorMonitor->VerifyFound();
12269 vkQueueWaitIdle(m_device->m_queue);
12270}
12271
Tobin Ehlisb093da82017-01-19 12:05:27 -070012272TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012273 TEST_DESCRIPTION(
12274 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12275 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012276
Tony Barbour1fa09702017-03-16 12:09:08 -060012277 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12279
12280 std::vector<const char *> device_extension_names;
12281 auto features = m_device->phy().features();
12282 // Make sure gs & ts are disabled
12283 features.geometryShader = false;
12284 features.tessellationShader = false;
12285 // The sacrificial device object
12286 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12287
12288 VkCommandPoolCreateInfo pool_create_info{};
12289 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12290 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12291
12292 VkCommandPool command_pool;
12293 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12294
12295 VkCommandBufferAllocateInfo cmd = {};
12296 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12297 cmd.pNext = NULL;
12298 cmd.commandPool = command_pool;
12299 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12300 cmd.commandBufferCount = 1;
12301
12302 VkCommandBuffer cmd_buffer;
12303 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12304 ASSERT_VK_SUCCESS(err);
12305
12306 VkEvent event;
12307 VkEventCreateInfo evci = {};
12308 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12309 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12310 ASSERT_VK_SUCCESS(result);
12311
12312 VkCommandBufferBeginInfo cbbi = {};
12313 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12314 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12316 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12317 m_errorMonitor->VerifyFound();
12318
12319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12320 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12321 m_errorMonitor->VerifyFound();
12322
12323 vkDestroyEvent(test_device.handle(), event, NULL);
12324 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12325}
12326
Mark Mueller917f6bc2016-08-30 10:57:19 -060012327TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012328 TEST_DESCRIPTION(
12329 "Use vkCmdExecuteCommands with invalid state "
12330 "in primary and secondary command buffers. "
12331 "Delete objects that are inuse. Call VkQueueSubmit "
12332 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012333
Tony Barbour1fa09702017-03-16 12:09:08 -060012334 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12336
Tony Barbour552f6c02016-12-21 14:34:07 -070012337 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012338
12339 VkEvent event;
12340 VkEventCreateInfo event_create_info = {};
12341 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12342 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012343 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012344
Tony Barbour552f6c02016-12-21 14:34:07 -070012345 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012346 vkDestroyEvent(m_device->device(), event, nullptr);
12347
12348 VkSubmitInfo submit_info = {};
12349 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12350 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012353 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12354 m_errorMonitor->VerifyFound();
12355
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012356 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012357 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12358
12359 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12360
Mark Mueller917f6bc2016-08-30 10:57:19 -060012361 VkSemaphoreCreateInfo semaphore_create_info = {};
12362 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12363 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012364 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012365 VkFenceCreateInfo fence_create_info = {};
12366 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12367 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012368 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012369
12370 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012371 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012372 descriptor_pool_type_count.descriptorCount = 1;
12373
12374 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12375 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12376 descriptor_pool_create_info.maxSets = 1;
12377 descriptor_pool_create_info.poolSizeCount = 1;
12378 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012380
12381 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012382 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012383
12384 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012385 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012386 descriptorset_layout_binding.descriptorCount = 1;
12387 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12388
12389 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012390 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012391 descriptorset_layout_create_info.bindingCount = 1;
12392 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12393
12394 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012395 ASSERT_VK_SUCCESS(
12396 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012397
12398 VkDescriptorSet descriptorset;
12399 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012400 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012401 descriptorset_allocate_info.descriptorSetCount = 1;
12402 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12403 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012405
Mark Mueller4042b652016-09-05 22:52:21 -060012406 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12407
12408 VkDescriptorBufferInfo buffer_info = {};
12409 buffer_info.buffer = buffer_test.GetBuffer();
12410 buffer_info.offset = 0;
12411 buffer_info.range = 1024;
12412
12413 VkWriteDescriptorSet write_descriptor_set = {};
12414 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12415 write_descriptor_set.dstSet = descriptorset;
12416 write_descriptor_set.descriptorCount = 1;
12417 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12418 write_descriptor_set.pBufferInfo = &buffer_info;
12419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012420 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012421
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012422 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12423 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012424
12425 VkPipelineObj pipe(m_device);
12426 pipe.AddColorAttachment();
12427 pipe.AddShader(&vs);
12428 pipe.AddShader(&fs);
12429
12430 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012431 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012432 pipeline_layout_create_info.setLayoutCount = 1;
12433 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12434
12435 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012436 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012437
12438 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12439
Tony Barbour552f6c02016-12-21 14:34:07 -070012440 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012441 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012443 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12444 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12445 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446
Tony Barbour552f6c02016-12-21 14:34:07 -070012447 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012448
Mark Mueller917f6bc2016-08-30 10:57:19 -060012449 submit_info.signalSemaphoreCount = 1;
12450 submit_info.pSignalSemaphores = &semaphore;
12451 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012452 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012453
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012455 vkDestroyEvent(m_device->device(), event, nullptr);
12456 m_errorMonitor->VerifyFound();
12457
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012459 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12460 m_errorMonitor->VerifyFound();
12461
Jeremy Hayes08369882017-02-02 10:31:06 -070012462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012463 vkDestroyFence(m_device->device(), fence, nullptr);
12464 m_errorMonitor->VerifyFound();
12465
Tobin Ehlis122207b2016-09-01 08:50:06 -070012466 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012467 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12468 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012469 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012470 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12471 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012472 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012473 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12474 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012475 vkDestroyEvent(m_device->device(), event, nullptr);
12476 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012477 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012478 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12479}
12480
Tobin Ehlis2adda372016-09-01 08:51:06 -070012481TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12482 TEST_DESCRIPTION("Delete in-use query pool.");
12483
Tony Barbour1fa09702017-03-16 12:09:08 -060012484 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12486
12487 VkQueryPool query_pool;
12488 VkQueryPoolCreateInfo query_pool_ci{};
12489 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12490 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12491 query_pool_ci.queryCount = 1;
12492 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012493 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012494 // Reset query pool to create binding with cmd buffer
12495 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12496
Tony Barbour552f6c02016-12-21 14:34:07 -070012497 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012498
12499 VkSubmitInfo submit_info = {};
12500 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12501 submit_info.commandBufferCount = 1;
12502 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12503 // Submit cmd buffer and then destroy query pool while in-flight
12504 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12505
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012507 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12508 m_errorMonitor->VerifyFound();
12509
12510 vkQueueWaitIdle(m_device->m_queue);
12511 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012512 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12513 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012514 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12515}
12516
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012517TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12518 TEST_DESCRIPTION("Delete in-use pipeline.");
12519
Tony Barbour1fa09702017-03-16 12:09:08 -060012520 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12522
12523 // Empty pipeline layout used for binding PSO
12524 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12525 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12526 pipeline_layout_ci.setLayoutCount = 0;
12527 pipeline_layout_ci.pSetLayouts = NULL;
12528
12529 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012530 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012531 ASSERT_VK_SUCCESS(err);
12532
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012534 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012535 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12536 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012537 // Store pipeline handle so we can actually delete it before test finishes
12538 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012539 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012540 VkPipelineObj pipe(m_device);
12541 pipe.AddShader(&vs);
12542 pipe.AddShader(&fs);
12543 pipe.AddColorAttachment();
12544 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12545 delete_this_pipeline = pipe.handle();
12546
Tony Barbour552f6c02016-12-21 14:34:07 -070012547 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012548 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012550
Tony Barbour552f6c02016-12-21 14:34:07 -070012551 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012552
12553 VkSubmitInfo submit_info = {};
12554 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12555 submit_info.commandBufferCount = 1;
12556 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12557 // Submit cmd buffer and then pipeline destroyed while in-flight
12558 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012559 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012560 m_errorMonitor->VerifyFound();
12561 // Make sure queue finished and then actually delete pipeline
12562 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012563 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12564 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012565 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12566 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12567}
12568
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012569TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12570 TEST_DESCRIPTION("Delete in-use imageView.");
12571
Tony Barbour1fa09702017-03-16 12:09:08 -060012572 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12574
12575 VkDescriptorPoolSize ds_type_count;
12576 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12577 ds_type_count.descriptorCount = 1;
12578
12579 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12580 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12581 ds_pool_ci.maxSets = 1;
12582 ds_pool_ci.poolSizeCount = 1;
12583 ds_pool_ci.pPoolSizes = &ds_type_count;
12584
12585 VkDescriptorPool ds_pool;
12586 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12587 ASSERT_VK_SUCCESS(err);
12588
12589 VkSamplerCreateInfo sampler_ci = {};
12590 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12591 sampler_ci.pNext = NULL;
12592 sampler_ci.magFilter = VK_FILTER_NEAREST;
12593 sampler_ci.minFilter = VK_FILTER_NEAREST;
12594 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12595 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12596 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12597 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12598 sampler_ci.mipLodBias = 1.0;
12599 sampler_ci.anisotropyEnable = VK_FALSE;
12600 sampler_ci.maxAnisotropy = 1;
12601 sampler_ci.compareEnable = VK_FALSE;
12602 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12603 sampler_ci.minLod = 1.0;
12604 sampler_ci.maxLod = 1.0;
12605 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12606 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12607 VkSampler sampler;
12608
12609 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12610 ASSERT_VK_SUCCESS(err);
12611
12612 VkDescriptorSetLayoutBinding layout_binding;
12613 layout_binding.binding = 0;
12614 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12615 layout_binding.descriptorCount = 1;
12616 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12617 layout_binding.pImmutableSamplers = NULL;
12618
12619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12621 ds_layout_ci.bindingCount = 1;
12622 ds_layout_ci.pBindings = &layout_binding;
12623 VkDescriptorSetLayout ds_layout;
12624 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12625 ASSERT_VK_SUCCESS(err);
12626
12627 VkDescriptorSetAllocateInfo alloc_info = {};
12628 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12629 alloc_info.descriptorSetCount = 1;
12630 alloc_info.descriptorPool = ds_pool;
12631 alloc_info.pSetLayouts = &ds_layout;
12632 VkDescriptorSet descriptor_set;
12633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12634 ASSERT_VK_SUCCESS(err);
12635
12636 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12637 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12638 pipeline_layout_ci.pNext = NULL;
12639 pipeline_layout_ci.setLayoutCount = 1;
12640 pipeline_layout_ci.pSetLayouts = &ds_layout;
12641
12642 VkPipelineLayout pipeline_layout;
12643 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12644 ASSERT_VK_SUCCESS(err);
12645
12646 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012647 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 -060012648 ASSERT_TRUE(image.initialized());
12649
12650 VkImageView view;
12651 VkImageViewCreateInfo ivci = {};
12652 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12653 ivci.image = image.handle();
12654 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12655 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12656 ivci.subresourceRange.layerCount = 1;
12657 ivci.subresourceRange.baseMipLevel = 0;
12658 ivci.subresourceRange.levelCount = 1;
12659 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12660
12661 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12662 ASSERT_VK_SUCCESS(err);
12663
12664 VkDescriptorImageInfo image_info{};
12665 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12666 image_info.imageView = view;
12667 image_info.sampler = sampler;
12668
12669 VkWriteDescriptorSet descriptor_write = {};
12670 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12671 descriptor_write.dstSet = descriptor_set;
12672 descriptor_write.dstBinding = 0;
12673 descriptor_write.descriptorCount = 1;
12674 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12675 descriptor_write.pImageInfo = &image_info;
12676
12677 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12678
12679 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012680 char const *vsSource =
12681 "#version 450\n"
12682 "\n"
12683 "out gl_PerVertex { \n"
12684 " vec4 gl_Position;\n"
12685 "};\n"
12686 "void main(){\n"
12687 " gl_Position = vec4(1);\n"
12688 "}\n";
12689 char const *fsSource =
12690 "#version 450\n"
12691 "\n"
12692 "layout(set=0, binding=0) uniform sampler2D s;\n"
12693 "layout(location=0) out vec4 x;\n"
12694 "void main(){\n"
12695 " x = texture(s, vec2(1));\n"
12696 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12699 VkPipelineObj pipe(m_device);
12700 pipe.AddShader(&vs);
12701 pipe.AddShader(&fs);
12702 pipe.AddColorAttachment();
12703 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12704
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012706
Tony Barbour552f6c02016-12-21 14:34:07 -070012707 m_commandBuffer->BeginCommandBuffer();
12708 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012709 // Bind pipeline to cmd buffer
12710 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12711 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12712 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012713
12714 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12715 VkRect2D scissor = {{0, 0}, {16, 16}};
12716 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12717 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12718
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012719 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012720 m_commandBuffer->EndRenderPass();
12721 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012722 // Submit cmd buffer then destroy sampler
12723 VkSubmitInfo submit_info = {};
12724 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12725 submit_info.commandBufferCount = 1;
12726 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12727 // Submit cmd buffer and then destroy imageView while in-flight
12728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12729
12730 vkDestroyImageView(m_device->device(), view, nullptr);
12731 m_errorMonitor->VerifyFound();
12732 vkQueueWaitIdle(m_device->m_queue);
12733 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012734 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12735 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012736 vkDestroyImageView(m_device->device(), view, NULL);
12737 vkDestroySampler(m_device->device(), sampler, nullptr);
12738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12741}
12742
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012743TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12744 TEST_DESCRIPTION("Delete in-use bufferView.");
12745
Tony Barbour1fa09702017-03-16 12:09:08 -060012746 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12748
12749 VkDescriptorPoolSize ds_type_count;
12750 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12751 ds_type_count.descriptorCount = 1;
12752
12753 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12754 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12755 ds_pool_ci.maxSets = 1;
12756 ds_pool_ci.poolSizeCount = 1;
12757 ds_pool_ci.pPoolSizes = &ds_type_count;
12758
12759 VkDescriptorPool ds_pool;
12760 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12761 ASSERT_VK_SUCCESS(err);
12762
12763 VkDescriptorSetLayoutBinding layout_binding;
12764 layout_binding.binding = 0;
12765 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12766 layout_binding.descriptorCount = 1;
12767 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12768 layout_binding.pImmutableSamplers = NULL;
12769
12770 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12771 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12772 ds_layout_ci.bindingCount = 1;
12773 ds_layout_ci.pBindings = &layout_binding;
12774 VkDescriptorSetLayout ds_layout;
12775 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12776 ASSERT_VK_SUCCESS(err);
12777
12778 VkDescriptorSetAllocateInfo alloc_info = {};
12779 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12780 alloc_info.descriptorSetCount = 1;
12781 alloc_info.descriptorPool = ds_pool;
12782 alloc_info.pSetLayouts = &ds_layout;
12783 VkDescriptorSet descriptor_set;
12784 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12785 ASSERT_VK_SUCCESS(err);
12786
12787 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12788 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12789 pipeline_layout_ci.pNext = NULL;
12790 pipeline_layout_ci.setLayoutCount = 1;
12791 pipeline_layout_ci.pSetLayouts = &ds_layout;
12792
12793 VkPipelineLayout pipeline_layout;
12794 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12795 ASSERT_VK_SUCCESS(err);
12796
12797 VkBuffer buffer;
12798 uint32_t queue_family_index = 0;
12799 VkBufferCreateInfo buffer_create_info = {};
12800 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12801 buffer_create_info.size = 1024;
12802 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12803 buffer_create_info.queueFamilyIndexCount = 1;
12804 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12805
12806 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12807 ASSERT_VK_SUCCESS(err);
12808
12809 VkMemoryRequirements memory_reqs;
12810 VkDeviceMemory buffer_memory;
12811
12812 VkMemoryAllocateInfo memory_info = {};
12813 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12814 memory_info.allocationSize = 0;
12815 memory_info.memoryTypeIndex = 0;
12816
12817 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12818 memory_info.allocationSize = memory_reqs.size;
12819 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12820 ASSERT_TRUE(pass);
12821
12822 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12823 ASSERT_VK_SUCCESS(err);
12824 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12825 ASSERT_VK_SUCCESS(err);
12826
12827 VkBufferView view;
12828 VkBufferViewCreateInfo bvci = {};
12829 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12830 bvci.buffer = buffer;
12831 bvci.format = VK_FORMAT_R8_UNORM;
12832 bvci.range = VK_WHOLE_SIZE;
12833
12834 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12835 ASSERT_VK_SUCCESS(err);
12836
12837 VkWriteDescriptorSet descriptor_write = {};
12838 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12839 descriptor_write.dstSet = descriptor_set;
12840 descriptor_write.dstBinding = 0;
12841 descriptor_write.descriptorCount = 1;
12842 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12843 descriptor_write.pTexelBufferView = &view;
12844
12845 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012847 char const *vsSource =
12848 "#version 450\n"
12849 "\n"
12850 "out gl_PerVertex { \n"
12851 " vec4 gl_Position;\n"
12852 "};\n"
12853 "void main(){\n"
12854 " gl_Position = vec4(1);\n"
12855 "}\n";
12856 char const *fsSource =
12857 "#version 450\n"
12858 "\n"
12859 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12860 "layout(location=0) out vec4 x;\n"
12861 "void main(){\n"
12862 " x = imageLoad(s, 0);\n"
12863 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12865 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12866 VkPipelineObj pipe(m_device);
12867 pipe.AddShader(&vs);
12868 pipe.AddShader(&fs);
12869 pipe.AddColorAttachment();
12870 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12871
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012873
Tony Barbour552f6c02016-12-21 14:34:07 -070012874 m_commandBuffer->BeginCommandBuffer();
12875 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012876 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12877 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12878 VkRect2D scissor = {{0, 0}, {16, 16}};
12879 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12880 // Bind pipeline to cmd buffer
12881 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12882 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12883 &descriptor_set, 0, nullptr);
12884 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012885 m_commandBuffer->EndRenderPass();
12886 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012887
12888 VkSubmitInfo submit_info = {};
12889 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12890 submit_info.commandBufferCount = 1;
12891 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12892 // Submit cmd buffer and then destroy bufferView while in-flight
12893 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12894
12895 vkDestroyBufferView(m_device->device(), view, nullptr);
12896 m_errorMonitor->VerifyFound();
12897 vkQueueWaitIdle(m_device->m_queue);
12898 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012899 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12900 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012901 vkDestroyBufferView(m_device->device(), view, NULL);
12902 vkDestroyBuffer(m_device->device(), buffer, NULL);
12903 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12904 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12905 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12906 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12907}
12908
Tobin Ehlis209532e2016-09-07 13:52:18 -060012909TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12910 TEST_DESCRIPTION("Delete in-use sampler.");
12911
Tony Barbour1fa09702017-03-16 12:09:08 -060012912 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12914
12915 VkDescriptorPoolSize ds_type_count;
12916 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12917 ds_type_count.descriptorCount = 1;
12918
12919 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12920 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12921 ds_pool_ci.maxSets = 1;
12922 ds_pool_ci.poolSizeCount = 1;
12923 ds_pool_ci.pPoolSizes = &ds_type_count;
12924
12925 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012926 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012927 ASSERT_VK_SUCCESS(err);
12928
12929 VkSamplerCreateInfo sampler_ci = {};
12930 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12931 sampler_ci.pNext = NULL;
12932 sampler_ci.magFilter = VK_FILTER_NEAREST;
12933 sampler_ci.minFilter = VK_FILTER_NEAREST;
12934 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12935 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12936 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12937 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12938 sampler_ci.mipLodBias = 1.0;
12939 sampler_ci.anisotropyEnable = VK_FALSE;
12940 sampler_ci.maxAnisotropy = 1;
12941 sampler_ci.compareEnable = VK_FALSE;
12942 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12943 sampler_ci.minLod = 1.0;
12944 sampler_ci.maxLod = 1.0;
12945 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12946 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12947 VkSampler sampler;
12948
12949 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12950 ASSERT_VK_SUCCESS(err);
12951
12952 VkDescriptorSetLayoutBinding layout_binding;
12953 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012954 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012955 layout_binding.descriptorCount = 1;
12956 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12957 layout_binding.pImmutableSamplers = NULL;
12958
12959 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12960 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12961 ds_layout_ci.bindingCount = 1;
12962 ds_layout_ci.pBindings = &layout_binding;
12963 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012964 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012965 ASSERT_VK_SUCCESS(err);
12966
12967 VkDescriptorSetAllocateInfo alloc_info = {};
12968 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12969 alloc_info.descriptorSetCount = 1;
12970 alloc_info.descriptorPool = ds_pool;
12971 alloc_info.pSetLayouts = &ds_layout;
12972 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012973 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012974 ASSERT_VK_SUCCESS(err);
12975
12976 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12977 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12978 pipeline_layout_ci.pNext = NULL;
12979 pipeline_layout_ci.setLayoutCount = 1;
12980 pipeline_layout_ci.pSetLayouts = &ds_layout;
12981
12982 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012984 ASSERT_VK_SUCCESS(err);
12985
12986 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012987 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 -060012988 ASSERT_TRUE(image.initialized());
12989
12990 VkImageView view;
12991 VkImageViewCreateInfo ivci = {};
12992 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12993 ivci.image = image.handle();
12994 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12995 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12996 ivci.subresourceRange.layerCount = 1;
12997 ivci.subresourceRange.baseMipLevel = 0;
12998 ivci.subresourceRange.levelCount = 1;
12999 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13000
13001 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13002 ASSERT_VK_SUCCESS(err);
13003
13004 VkDescriptorImageInfo image_info{};
13005 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13006 image_info.imageView = view;
13007 image_info.sampler = sampler;
13008
13009 VkWriteDescriptorSet descriptor_write = {};
13010 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13011 descriptor_write.dstSet = descriptor_set;
13012 descriptor_write.dstBinding = 0;
13013 descriptor_write.descriptorCount = 1;
13014 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13015 descriptor_write.pImageInfo = &image_info;
13016
13017 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13018
13019 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013020 char const *vsSource =
13021 "#version 450\n"
13022 "\n"
13023 "out gl_PerVertex { \n"
13024 " vec4 gl_Position;\n"
13025 "};\n"
13026 "void main(){\n"
13027 " gl_Position = vec4(1);\n"
13028 "}\n";
13029 char const *fsSource =
13030 "#version 450\n"
13031 "\n"
13032 "layout(set=0, binding=0) uniform sampler2D s;\n"
13033 "layout(location=0) out vec4 x;\n"
13034 "void main(){\n"
13035 " x = texture(s, vec2(1));\n"
13036 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13038 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13039 VkPipelineObj pipe(m_device);
13040 pipe.AddShader(&vs);
13041 pipe.AddShader(&fs);
13042 pipe.AddColorAttachment();
13043 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13044
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046
Tony Barbour552f6c02016-12-21 14:34:07 -070013047 m_commandBuffer->BeginCommandBuffer();
13048 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013049 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013050 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13051 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13052 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013053
13054 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13055 VkRect2D scissor = {{0, 0}, {16, 16}};
13056 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13057 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13058
Tobin Ehlis209532e2016-09-07 13:52:18 -060013059 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013060 m_commandBuffer->EndRenderPass();
13061 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013062 // Submit cmd buffer then destroy sampler
13063 VkSubmitInfo submit_info = {};
13064 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13065 submit_info.commandBufferCount = 1;
13066 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13067 // Submit cmd buffer and then destroy sampler while in-flight
13068 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13069
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013070 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013071 m_errorMonitor->VerifyFound();
13072 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013073
Tobin Ehlis209532e2016-09-07 13:52:18 -060013074 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013075 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13076 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013077 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013078 vkDestroyImageView(m_device->device(), view, NULL);
13079 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13082}
13083
Mark Mueller1cd9f412016-08-25 13:23:52 -060013084TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013085 TEST_DESCRIPTION(
13086 "Call VkQueueSubmit with a semaphore that is already "
13087 "signaled but not waited on by the queue. Wait on a "
13088 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013089
Tony Barbour1fa09702017-03-16 12:09:08 -060013090 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013093 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 -070013094 const char *invalid_fence_wait_message =
13095 " which has not been submitted on a Queue or during "
13096 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013097
Tony Barbour552f6c02016-12-21 14:34:07 -070013098 m_commandBuffer->BeginCommandBuffer();
13099 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013100
13101 VkSemaphoreCreateInfo semaphore_create_info = {};
13102 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13103 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013104 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013105 VkSubmitInfo submit_info = {};
13106 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13107 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013108 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013109 submit_info.signalSemaphoreCount = 1;
13110 submit_info.pSignalSemaphores = &semaphore;
13111 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013112 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013113 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013114 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013115 m_commandBuffer->BeginCommandBuffer();
13116 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013118 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13119 m_errorMonitor->VerifyFound();
13120
Mark Mueller1cd9f412016-08-25 13:23:52 -060013121 VkFenceCreateInfo fence_create_info = {};
13122 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13123 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013124 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013127 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13128 m_errorMonitor->VerifyFound();
13129
Mark Mueller4042b652016-09-05 22:52:21 -060013130 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013131 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013132 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13133}
13134
Tobin Ehlis4af23302016-07-19 10:50:30 -060013135TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013136 TEST_DESCRIPTION(
13137 "Bind a secondary command buffer with with a framebuffer "
13138 "that does not match the framebuffer for the active "
13139 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13142
13143 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013144 VkAttachmentDescription attachment = {0,
13145 VK_FORMAT_B8G8R8A8_UNORM,
13146 VK_SAMPLE_COUNT_1_BIT,
13147 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13148 VK_ATTACHMENT_STORE_OP_STORE,
13149 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13150 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13151 VK_IMAGE_LAYOUT_UNDEFINED,
13152 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013153
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013154 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013155
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013156 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013157
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013158 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013159
13160 VkRenderPass rp;
13161 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13162 ASSERT_VK_SUCCESS(err);
13163
13164 // A compatible framebuffer.
13165 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013166 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 -060013167 ASSERT_TRUE(image.initialized());
13168
13169 VkImageViewCreateInfo ivci = {
13170 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13171 nullptr,
13172 0,
13173 image.handle(),
13174 VK_IMAGE_VIEW_TYPE_2D,
13175 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013176 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13177 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013178 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13179 };
13180 VkImageView view;
13181 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13182 ASSERT_VK_SUCCESS(err);
13183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013184 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013185 VkFramebuffer fb;
13186 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13187 ASSERT_VK_SUCCESS(err);
13188
13189 VkCommandBufferAllocateInfo cbai = {};
13190 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013191 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013192 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13193 cbai.commandBufferCount = 1;
13194
13195 VkCommandBuffer sec_cb;
13196 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13197 ASSERT_VK_SUCCESS(err);
13198 VkCommandBufferBeginInfo cbbi = {};
13199 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013200 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013201 cbii.renderPass = renderPass();
13202 cbii.framebuffer = fb;
13203 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13204 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013205 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 -060013206 cbbi.pInheritanceInfo = &cbii;
13207 vkBeginCommandBuffer(sec_cb, &cbbi);
13208 vkEndCommandBuffer(sec_cb);
13209
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013210 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013211 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13212 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013213
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013215 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013216 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13217 m_errorMonitor->VerifyFound();
13218 // Cleanup
13219 vkDestroyImageView(m_device->device(), view, NULL);
13220 vkDestroyRenderPass(m_device->device(), rp, NULL);
13221 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13222}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013223
13224TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013225 TEST_DESCRIPTION(
13226 "If logicOp is available on the device, set it to an "
13227 "invalid value. If logicOp is not available, attempt to "
13228 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13231
13232 auto features = m_device->phy().features();
13233 // Set the expected error depending on whether or not logicOp available
13234 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13236 "If logic operations feature not "
13237 "enabled, logicOpEnable must be "
13238 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013239 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013241 }
13242 // Create a pipeline using logicOp
13243 VkResult err;
13244
13245 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13246 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13247
13248 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013249 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013250 ASSERT_VK_SUCCESS(err);
13251
13252 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13253 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13254 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013255 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013256 vp_state_ci.pViewports = &vp;
13257 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013258 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013259 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013260
13261 VkPipelineShaderStageCreateInfo shaderStages[2];
13262 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013264 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13265 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013266 shaderStages[0] = vs.GetStageCreateInfo();
13267 shaderStages[1] = fs.GetStageCreateInfo();
13268
13269 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13270 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13271
13272 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13273 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13274 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13275
13276 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13277 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013278 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013279
13280 VkPipelineColorBlendAttachmentState att = {};
13281 att.blendEnable = VK_FALSE;
13282 att.colorWriteMask = 0xf;
13283
13284 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13285 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13286 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13287 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013288 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013289 cb_ci.attachmentCount = 1;
13290 cb_ci.pAttachments = &att;
13291
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013292 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13293 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13294 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13295
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013296 VkGraphicsPipelineCreateInfo gp_ci = {};
13297 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13298 gp_ci.stageCount = 2;
13299 gp_ci.pStages = shaderStages;
13300 gp_ci.pVertexInputState = &vi_ci;
13301 gp_ci.pInputAssemblyState = &ia_ci;
13302 gp_ci.pViewportState = &vp_state_ci;
13303 gp_ci.pRasterizationState = &rs_ci;
13304 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013305 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013306 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13307 gp_ci.layout = pipeline_layout;
13308 gp_ci.renderPass = renderPass();
13309
13310 VkPipelineCacheCreateInfo pc_ci = {};
13311 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13312
13313 VkPipeline pipeline;
13314 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013315 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013316 ASSERT_VK_SUCCESS(err);
13317
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013318 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013319 m_errorMonitor->VerifyFound();
13320 if (VK_SUCCESS == err) {
13321 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13322 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013323 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13324 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13325}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013326
Mike Stroyanaccf7692015-05-12 16:00:45 -060013327#if GTEST_IS_THREADSAFE
13328struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013329 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013330 VkEvent event;
13331 bool bailout;
13332};
13333
Karl Schultz6addd812016-02-02 17:17:23 -070013334extern "C" void *AddToCommandBuffer(void *arg) {
13335 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013336
Mike Stroyana6d14942016-07-13 15:10:05 -060013337 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013338 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013339 if (data->bailout) {
13340 break;
13341 }
13342 }
13343 return NULL;
13344}
13345
Karl Schultz6addd812016-02-02 17:17:23 -070013346TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013347 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013348
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013350
Tony Barbour1fa09702017-03-16 12:09:08 -060013351 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013352 ASSERT_NO_FATAL_FAILURE(InitViewport());
13353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13354
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013355 // Calls AllocateCommandBuffers
13356 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013357
13358 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013359 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013360
13361 VkEventCreateInfo event_info;
13362 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013363 VkResult err;
13364
13365 memset(&event_info, 0, sizeof(event_info));
13366 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13367
Chia-I Wuf7458c52015-10-26 21:10:41 +080013368 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013369 ASSERT_VK_SUCCESS(err);
13370
Mike Stroyanaccf7692015-05-12 16:00:45 -060013371 err = vkResetEvent(device(), event);
13372 ASSERT_VK_SUCCESS(err);
13373
13374 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013375 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013376 data.event = event;
13377 data.bailout = false;
13378 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013379
13380 // First do some correct operations using multiple threads.
13381 // Add many entries to command buffer from another thread.
13382 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13383 // Make non-conflicting calls from this thread at the same time.
13384 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013385 uint32_t count;
13386 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013387 }
13388 test_platform_thread_join(thread, NULL);
13389
13390 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013391 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013392 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013393 // Add many entries to command buffer from this thread at the same time.
13394 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013395
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013396 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013397 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013398
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013399 m_errorMonitor->SetBailout(NULL);
13400
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013401 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013402
Chia-I Wuf7458c52015-10-26 21:10:41 +080013403 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013404}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013405#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013406
Karl Schultz6addd812016-02-02 17:17:23 -070013407TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013408 TEST_DESCRIPTION(
13409 "Test that an error is produced for a spirv module "
13410 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013413
Tony Barbour1fa09702017-03-16 12:09:08 -060013414 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13416
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013417 VkShaderModule module;
13418 VkShaderModuleCreateInfo moduleCreateInfo;
13419 struct icd_spv_header spv;
13420
13421 spv.magic = ICD_SPV_MAGIC;
13422 spv.version = ICD_SPV_VERSION;
13423 spv.gen_magic = 0;
13424
13425 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13426 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013427 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013428 moduleCreateInfo.codeSize = 4;
13429 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013430 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013431
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013432 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013433}
13434
Karl Schultz6addd812016-02-02 17:17:23 -070013435TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013436 TEST_DESCRIPTION(
13437 "Test that an error is produced for a spirv module "
13438 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013439
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013441
Tony Barbour1fa09702017-03-16 12:09:08 -060013442 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13444
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013445 VkShaderModule module;
13446 VkShaderModuleCreateInfo moduleCreateInfo;
13447 struct icd_spv_header spv;
13448
13449 spv.magic = ~ICD_SPV_MAGIC;
13450 spv.version = ICD_SPV_VERSION;
13451 spv.gen_magic = 0;
13452
13453 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13454 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013455 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013456 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13457 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013458 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013459
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013460 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013461}
13462
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013463#if 0
13464// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013465TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013467 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013468
Tony Barbour1fa09702017-03-16 12:09:08 -060013469 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13471
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013472 VkShaderModule module;
13473 VkShaderModuleCreateInfo moduleCreateInfo;
13474 struct icd_spv_header spv;
13475
13476 spv.magic = ICD_SPV_MAGIC;
13477 spv.version = ~ICD_SPV_VERSION;
13478 spv.gen_magic = 0;
13479
13480 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13481 moduleCreateInfo.pNext = NULL;
13482
Karl Schultz6addd812016-02-02 17:17:23 -070013483 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013484 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13485 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013486 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013488 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013489}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013490#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013491
Karl Schultz6addd812016-02-02 17:17:23 -070013492TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013493 TEST_DESCRIPTION(
13494 "Test that a warning is produced for a vertex output that "
13495 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013497
Tony Barbour1fa09702017-03-16 12:09:08 -060013498 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013500
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013501 char const *vsSource =
13502 "#version 450\n"
13503 "\n"
13504 "layout(location=0) out float x;\n"
13505 "out gl_PerVertex {\n"
13506 " vec4 gl_Position;\n"
13507 "};\n"
13508 "void main(){\n"
13509 " gl_Position = vec4(1);\n"
13510 " x = 0;\n"
13511 "}\n";
13512 char const *fsSource =
13513 "#version 450\n"
13514 "\n"
13515 "layout(location=0) out vec4 color;\n"
13516 "void main(){\n"
13517 " color = vec4(1);\n"
13518 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013519
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013520 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13521 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013522
13523 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013524 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013525 pipe.AddShader(&vs);
13526 pipe.AddShader(&fs);
13527
Chris Forbes9f7ff632015-05-25 11:13:08 +120013528 VkDescriptorSetObj descriptorSet(m_device);
13529 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013530 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013531
Tony Barbour5781e8f2015-08-04 16:23:11 -060013532 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013533
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013534 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013535}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013536
Mark Mueller098c9cb2016-09-08 09:01:57 -060013537TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13538 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13539
Tony Barbour1fa09702017-03-16 12:09:08 -060013540 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13542
13543 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013544 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013545
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013546 char const *vsSource =
13547 "#version 450\n"
13548 "\n"
13549 "out gl_PerVertex {\n"
13550 " vec4 gl_Position;\n"
13551 "};\n"
13552 "void main(){\n"
13553 " gl_Position = vec4(1);\n"
13554 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013555
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013556 char const *fsSource =
13557 "#version 450\n"
13558 "\n"
13559 "layout (constant_id = 0) const float r = 0.0f;\n"
13560 "layout(location = 0) out vec4 uFragColor;\n"
13561 "void main(){\n"
13562 " uFragColor = vec4(r,1,0,1);\n"
13563 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013564
13565 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13566 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13567
13568 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13569 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13570
13571 VkPipelineLayout pipeline_layout;
13572 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13573
13574 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13575 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13576 vp_state_create_info.viewportCount = 1;
13577 VkViewport viewport = {};
13578 vp_state_create_info.pViewports = &viewport;
13579 vp_state_create_info.scissorCount = 1;
13580 VkRect2D scissors = {};
13581 vp_state_create_info.pScissors = &scissors;
13582
13583 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13584
13585 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13586 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13587 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13588 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13589
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013590 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013591
13592 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13593 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13594
13595 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13596 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13597 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13598
13599 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13600 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13601 rasterization_state_create_info.pNext = nullptr;
13602 rasterization_state_create_info.lineWidth = 1.0f;
13603 rasterization_state_create_info.rasterizerDiscardEnable = true;
13604
13605 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13606 color_blend_attachment_state.blendEnable = VK_FALSE;
13607 color_blend_attachment_state.colorWriteMask = 0xf;
13608
13609 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13610 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13611 color_blend_state_create_info.attachmentCount = 1;
13612 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13613
13614 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13615 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13616 graphicspipe_create_info.stageCount = 2;
13617 graphicspipe_create_info.pStages = shader_stage_create_info;
13618 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13619 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13620 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13621 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13622 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13623 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13624 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13625 graphicspipe_create_info.layout = pipeline_layout;
13626 graphicspipe_create_info.renderPass = renderPass();
13627
13628 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13629 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13630
13631 VkPipelineCache pipelineCache;
13632 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13633
13634 // This structure maps constant ids to data locations.
13635 const VkSpecializationMapEntry entry =
13636 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013637 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013638
13639 uint32_t data = 1;
13640
13641 // Set up the info describing spec map and data
13642 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013643 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013644 };
13645 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13646
13647 VkPipeline pipeline;
13648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13649 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13650 m_errorMonitor->VerifyFound();
13651
13652 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13653 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13654}
13655
13656TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13657 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13658
Tony Barbour1fa09702017-03-16 12:09:08 -060013659 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013660 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13661
13662 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13663
13664 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13665 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13666 descriptor_pool_type_count[0].descriptorCount = 1;
13667 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13668 descriptor_pool_type_count[1].descriptorCount = 1;
13669
13670 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13671 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13672 descriptor_pool_create_info.maxSets = 1;
13673 descriptor_pool_create_info.poolSizeCount = 2;
13674 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13675 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13676
13677 VkDescriptorPool descriptorset_pool;
13678 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13679
13680 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13681 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13682 descriptorset_layout_binding.descriptorCount = 1;
13683 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013684 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013685
13686 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13687 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13688 descriptorset_layout_create_info.bindingCount = 1;
13689 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13690
13691 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013692 ASSERT_VK_SUCCESS(
13693 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013694
13695 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13696 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13697 descriptorset_allocate_info.descriptorSetCount = 1;
13698 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13699 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13700 VkDescriptorSet descriptorset;
13701 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13702
13703 // Challenge core_validation with a non uniform buffer type.
13704 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013706 char const *vsSource =
13707 "#version 450\n"
13708 "\n"
13709 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13710 " mat4 mvp;\n"
13711 "} ubuf;\n"
13712 "out gl_PerVertex {\n"
13713 " vec4 gl_Position;\n"
13714 "};\n"
13715 "void main(){\n"
13716 " gl_Position = ubuf.mvp * vec4(1);\n"
13717 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013718
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013719 char const *fsSource =
13720 "#version 450\n"
13721 "\n"
13722 "layout(location = 0) out vec4 uFragColor;\n"
13723 "void main(){\n"
13724 " uFragColor = vec4(0,1,0,1);\n"
13725 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013726
13727 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13728 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13729
13730 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13731 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13732 pipeline_layout_create_info.setLayoutCount = 1;
13733 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13734
13735 VkPipelineLayout pipeline_layout;
13736 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13737
13738 VkPipelineObj pipe(m_device);
13739 pipe.AddColorAttachment();
13740 pipe.AddShader(&vs);
13741 pipe.AddShader(&fs);
13742
13743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13744 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13745 m_errorMonitor->VerifyFound();
13746
13747 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13748 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13749 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13750}
13751
13752TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13753 TEST_DESCRIPTION(
13754 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13755
Tony Barbour1fa09702017-03-16 12:09:08 -060013756 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13758
13759 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13760
13761 VkDescriptorPoolSize descriptor_pool_type_count = {};
13762 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13763 descriptor_pool_type_count.descriptorCount = 1;
13764
13765 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13766 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13767 descriptor_pool_create_info.maxSets = 1;
13768 descriptor_pool_create_info.poolSizeCount = 1;
13769 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13770 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13771
13772 VkDescriptorPool descriptorset_pool;
13773 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13774
13775 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13776 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13777 descriptorset_layout_binding.descriptorCount = 1;
13778 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13779 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013780 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013781
13782 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13783 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13784 descriptorset_layout_create_info.bindingCount = 1;
13785 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13786
13787 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013788 ASSERT_VK_SUCCESS(
13789 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013790
13791 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13792 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13793 descriptorset_allocate_info.descriptorSetCount = 1;
13794 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13795 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13796 VkDescriptorSet descriptorset;
13797 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13798
13799 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13800
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013801 char const *vsSource =
13802 "#version 450\n"
13803 "\n"
13804 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13805 " mat4 mvp;\n"
13806 "} ubuf;\n"
13807 "out gl_PerVertex {\n"
13808 " vec4 gl_Position;\n"
13809 "};\n"
13810 "void main(){\n"
13811 " gl_Position = ubuf.mvp * vec4(1);\n"
13812 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013814 char const *fsSource =
13815 "#version 450\n"
13816 "\n"
13817 "layout(location = 0) out vec4 uFragColor;\n"
13818 "void main(){\n"
13819 " uFragColor = vec4(0,1,0,1);\n"
13820 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013821
13822 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13823 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13824
13825 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13826 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13827 pipeline_layout_create_info.setLayoutCount = 1;
13828 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13829
13830 VkPipelineLayout pipeline_layout;
13831 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13832
13833 VkPipelineObj pipe(m_device);
13834 pipe.AddColorAttachment();
13835 pipe.AddShader(&vs);
13836 pipe.AddShader(&fs);
13837
13838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13839 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13840 m_errorMonitor->VerifyFound();
13841
13842 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13843 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13844 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13845}
13846
13847TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013848 TEST_DESCRIPTION(
13849 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13850 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013851
Tony Barbour1fa09702017-03-16 12:09:08 -060013852 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13854
13855 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013856 "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 -060013857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013858 char const *vsSource =
13859 "#version 450\n"
13860 "\n"
13861 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13862 "out gl_PerVertex {\n"
13863 " vec4 gl_Position;\n"
13864 "};\n"
13865 "void main(){\n"
13866 " gl_Position = vec4(consts.x);\n"
13867 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013868
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013869 char const *fsSource =
13870 "#version 450\n"
13871 "\n"
13872 "layout(location = 0) out vec4 uFragColor;\n"
13873 "void main(){\n"
13874 " uFragColor = vec4(0,1,0,1);\n"
13875 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013876
13877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13878 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13879
13880 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13881 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13882
13883 // Set up a push constant range
13884 VkPushConstantRange push_constant_ranges = {};
13885 // Set to the wrong stage to challenge core_validation
13886 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13887 push_constant_ranges.size = 4;
13888
13889 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13890 pipeline_layout_create_info.pushConstantRangeCount = 1;
13891
13892 VkPipelineLayout pipeline_layout;
13893 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13894
13895 VkPipelineObj pipe(m_device);
13896 pipe.AddColorAttachment();
13897 pipe.AddShader(&vs);
13898 pipe.AddShader(&fs);
13899
13900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13901 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13902 m_errorMonitor->VerifyFound();
13903
13904 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13905}
13906
13907TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13908 TEST_DESCRIPTION(
13909 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13910
Tony Barbour1fa09702017-03-16 12:09:08 -060013911 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013912 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13913
13914 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013915 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013916
13917 // Some awkward steps are required to test with custom device features.
13918 std::vector<const char *> device_extension_names;
13919 auto features = m_device->phy().features();
13920 // Disable support for 64 bit floats
13921 features.shaderFloat64 = false;
13922 // The sacrificial device object
13923 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13924
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013925 char const *vsSource =
13926 "#version 450\n"
13927 "\n"
13928 "out gl_PerVertex {\n"
13929 " vec4 gl_Position;\n"
13930 "};\n"
13931 "void main(){\n"
13932 " gl_Position = vec4(1);\n"
13933 "}\n";
13934 char const *fsSource =
13935 "#version 450\n"
13936 "\n"
13937 "layout(location=0) out vec4 color;\n"
13938 "void main(){\n"
13939 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13940 " color = vec4(green);\n"
13941 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013942
13943 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13944 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13945
13946 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013947
13948 VkPipelineObj pipe(&test_device);
13949 pipe.AddColorAttachment();
13950 pipe.AddShader(&vs);
13951 pipe.AddShader(&fs);
13952
13953 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13954 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13955 VkPipelineLayout pipeline_layout;
13956 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13957
13958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13959 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13960 m_errorMonitor->VerifyFound();
13961
13962 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13963}
13964
Mark Lobodzinski20832822017-03-24 14:49:45 -060013965TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13966 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13967 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013968
Tony Barbour1fa09702017-03-16 12:09:08 -060013969 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13971
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013972 char const *vsSource =
13973 "#version 450\n"
13974 "\n"
13975 "out gl_PerVertex {\n"
13976 " vec4 gl_Position;\n"
13977 "};\n"
13978 "layout(xfb_buffer = 1) out;"
13979 "void main(){\n"
13980 " gl_Position = vec4(1);\n"
13981 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013982
Mark Lobodzinski20832822017-03-24 14:49:45 -060013983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013984
Mark Lobodzinski20832822017-03-24 14:49:45 -060013985 std::vector<unsigned int> spv;
13986 VkShaderModuleCreateInfo module_create_info;
13987 VkShaderModule shader_module;
13988 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13989 module_create_info.pNext = NULL;
13990 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13991 module_create_info.pCode = spv.data();
13992 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13993 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013994
Mark Lobodzinski20832822017-03-24 14:49:45 -060013995 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013996
Mark Lobodzinski20832822017-03-24 14:49:45 -060013997 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013998}
13999
Karl Schultz6addd812016-02-02 17:17:23 -070014000TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014001 TEST_DESCRIPTION(
14002 "Test that an error is produced for a fragment shader input "
14003 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014004
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014006
Tony Barbour1fa09702017-03-16 12:09:08 -060014007 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014009
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014010 char const *vsSource =
14011 "#version 450\n"
14012 "\n"
14013 "out gl_PerVertex {\n"
14014 " vec4 gl_Position;\n"
14015 "};\n"
14016 "void main(){\n"
14017 " gl_Position = vec4(1);\n"
14018 "}\n";
14019 char const *fsSource =
14020 "#version 450\n"
14021 "\n"
14022 "layout(location=0) in float x;\n"
14023 "layout(location=0) out vec4 color;\n"
14024 "void main(){\n"
14025 " color = vec4(x);\n"
14026 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014027
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014028 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14029 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014030
14031 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014032 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014033 pipe.AddShader(&vs);
14034 pipe.AddShader(&fs);
14035
Chris Forbes59cb88d2015-05-25 11:13:13 +120014036 VkDescriptorSetObj descriptorSet(m_device);
14037 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014038 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014039
Tony Barbour5781e8f2015-08-04 16:23:11 -060014040 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014041
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014042 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014043}
14044
Karl Schultz6addd812016-02-02 17:17:23 -070014045TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014046 TEST_DESCRIPTION(
14047 "Test that an error is produced for a fragment shader input "
14048 "within an interace block, which is not present in the outputs "
14049 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014051
Tony Barbour1fa09702017-03-16 12:09:08 -060014052 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14054
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014055 char const *vsSource =
14056 "#version 450\n"
14057 "\n"
14058 "out gl_PerVertex {\n"
14059 " vec4 gl_Position;\n"
14060 "};\n"
14061 "void main(){\n"
14062 " gl_Position = vec4(1);\n"
14063 "}\n";
14064 char const *fsSource =
14065 "#version 450\n"
14066 "\n"
14067 "in block { layout(location=0) float x; } ins;\n"
14068 "layout(location=0) out vec4 color;\n"
14069 "void main(){\n"
14070 " color = vec4(ins.x);\n"
14071 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014072
14073 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14074 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14075
14076 VkPipelineObj pipe(m_device);
14077 pipe.AddColorAttachment();
14078 pipe.AddShader(&vs);
14079 pipe.AddShader(&fs);
14080
14081 VkDescriptorSetObj descriptorSet(m_device);
14082 descriptorSet.AppendDummy();
14083 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14084
14085 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14086
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014087 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014088}
14089
Karl Schultz6addd812016-02-02 17:17:23 -070014090TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014091 TEST_DESCRIPTION(
14092 "Test that an error is produced for mismatched array sizes "
14093 "across the vertex->fragment shader interface");
14094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14095 "Type mismatch on location 0.0: 'ptr to "
14096 "output arr[2] of float32' vs 'ptr to "
14097 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014098
Tony Barbour1fa09702017-03-16 12:09:08 -060014099 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14101
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014102 char const *vsSource =
14103 "#version 450\n"
14104 "\n"
14105 "layout(location=0) out float x[2];\n"
14106 "out gl_PerVertex {\n"
14107 " vec4 gl_Position;\n"
14108 "};\n"
14109 "void main(){\n"
14110 " x[0] = 0; x[1] = 0;\n"
14111 " gl_Position = vec4(1);\n"
14112 "}\n";
14113 char const *fsSource =
14114 "#version 450\n"
14115 "\n"
14116 "layout(location=0) in float x[1];\n"
14117 "layout(location=0) out vec4 color;\n"
14118 "void main(){\n"
14119 " color = vec4(x[0]);\n"
14120 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014121
14122 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14123 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14124
14125 VkPipelineObj pipe(m_device);
14126 pipe.AddColorAttachment();
14127 pipe.AddShader(&vs);
14128 pipe.AddShader(&fs);
14129
14130 VkDescriptorSetObj descriptorSet(m_device);
14131 descriptorSet.AppendDummy();
14132 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14133
14134 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14135
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014136 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014137}
14138
Karl Schultz6addd812016-02-02 17:17:23 -070014139TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014140 TEST_DESCRIPTION(
14141 "Test that an error is produced for mismatched types across "
14142 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014144
Tony Barbour1fa09702017-03-16 12:09:08 -060014145 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014148 char const *vsSource =
14149 "#version 450\n"
14150 "\n"
14151 "layout(location=0) out int x;\n"
14152 "out gl_PerVertex {\n"
14153 " vec4 gl_Position;\n"
14154 "};\n"
14155 "void main(){\n"
14156 " x = 0;\n"
14157 " gl_Position = vec4(1);\n"
14158 "}\n";
14159 char const *fsSource =
14160 "#version 450\n"
14161 "\n"
14162 "layout(location=0) in float x;\n" /* VS writes int */
14163 "layout(location=0) out vec4 color;\n"
14164 "void main(){\n"
14165 " color = vec4(x);\n"
14166 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014167
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014168 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14169 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014170
14171 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014172 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014173 pipe.AddShader(&vs);
14174 pipe.AddShader(&fs);
14175
Chris Forbesb56af562015-05-25 11:13:17 +120014176 VkDescriptorSetObj descriptorSet(m_device);
14177 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014178 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014179
Tony Barbour5781e8f2015-08-04 16:23:11 -060014180 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014181
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014182 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014183}
14184
Karl Schultz6addd812016-02-02 17:17:23 -070014185TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014186 TEST_DESCRIPTION(
14187 "Test that an error is produced for mismatched types across "
14188 "the vertex->fragment shader interface, when the variable is contained within "
14189 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014191
Tony Barbour1fa09702017-03-16 12:09:08 -060014192 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14194
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014195 char const *vsSource =
14196 "#version 450\n"
14197 "\n"
14198 "out block { layout(location=0) int x; } outs;\n"
14199 "out gl_PerVertex {\n"
14200 " vec4 gl_Position;\n"
14201 "};\n"
14202 "void main(){\n"
14203 " outs.x = 0;\n"
14204 " gl_Position = vec4(1);\n"
14205 "}\n";
14206 char const *fsSource =
14207 "#version 450\n"
14208 "\n"
14209 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14210 "layout(location=0) out vec4 color;\n"
14211 "void main(){\n"
14212 " color = vec4(ins.x);\n"
14213 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014214
14215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14217
14218 VkPipelineObj pipe(m_device);
14219 pipe.AddColorAttachment();
14220 pipe.AddShader(&vs);
14221 pipe.AddShader(&fs);
14222
14223 VkDescriptorSetObj descriptorSet(m_device);
14224 descriptorSet.AppendDummy();
14225 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14226
14227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14228
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014229 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014230}
14231
14232TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014233 TEST_DESCRIPTION(
14234 "Test that an error is produced for location mismatches across "
14235 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14236 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014237 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 +130014238
Tony Barbour1fa09702017-03-16 12:09:08 -060014239 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14241
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014242 char const *vsSource =
14243 "#version 450\n"
14244 "\n"
14245 "out block { layout(location=1) float x; } outs;\n"
14246 "out gl_PerVertex {\n"
14247 " vec4 gl_Position;\n"
14248 "};\n"
14249 "void main(){\n"
14250 " outs.x = 0;\n"
14251 " gl_Position = vec4(1);\n"
14252 "}\n";
14253 char const *fsSource =
14254 "#version 450\n"
14255 "\n"
14256 "in block { layout(location=0) float x; } ins;\n"
14257 "layout(location=0) out vec4 color;\n"
14258 "void main(){\n"
14259 " color = vec4(ins.x);\n"
14260 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014261
14262 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14263 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14264
14265 VkPipelineObj pipe(m_device);
14266 pipe.AddColorAttachment();
14267 pipe.AddShader(&vs);
14268 pipe.AddShader(&fs);
14269
14270 VkDescriptorSetObj descriptorSet(m_device);
14271 descriptorSet.AppendDummy();
14272 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14273
14274 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14275
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014276 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014277}
14278
14279TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014280 TEST_DESCRIPTION(
14281 "Test that an error is produced for component mismatches across the "
14282 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14283 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014284 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 +130014285
Tony Barbour1fa09702017-03-16 12:09:08 -060014286 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014287 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14288
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014289 char const *vsSource =
14290 "#version 450\n"
14291 "\n"
14292 "out block { layout(location=0, component=0) float x; } outs;\n"
14293 "out gl_PerVertex {\n"
14294 " vec4 gl_Position;\n"
14295 "};\n"
14296 "void main(){\n"
14297 " outs.x = 0;\n"
14298 " gl_Position = vec4(1);\n"
14299 "}\n";
14300 char const *fsSource =
14301 "#version 450\n"
14302 "\n"
14303 "in block { layout(location=0, component=1) float x; } ins;\n"
14304 "layout(location=0) out vec4 color;\n"
14305 "void main(){\n"
14306 " color = vec4(ins.x);\n"
14307 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014308
14309 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14310 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14311
14312 VkPipelineObj pipe(m_device);
14313 pipe.AddColorAttachment();
14314 pipe.AddShader(&vs);
14315 pipe.AddShader(&fs);
14316
14317 VkDescriptorSetObj descriptorSet(m_device);
14318 descriptorSet.AppendDummy();
14319 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14320
14321 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14322
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014323 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014324}
14325
Chris Forbes1f3b0152016-11-30 12:48:40 +130014326TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14327 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14328
Tony Barbour1fa09702017-03-16 12:09:08 -060014329 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14331
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014332 char const *vsSource =
14333 "#version 450\n"
14334 "layout(location=0) out mediump float x;\n"
14335 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14336 char const *fsSource =
14337 "#version 450\n"
14338 "layout(location=0) in highp float x;\n"
14339 "layout(location=0) out vec4 color;\n"
14340 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014341
14342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14344
14345 VkPipelineObj pipe(m_device);
14346 pipe.AddColorAttachment();
14347 pipe.AddShader(&vs);
14348 pipe.AddShader(&fs);
14349
14350 VkDescriptorSetObj descriptorSet(m_device);
14351 descriptorSet.AppendDummy();
14352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14353
14354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14355
14356 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14357
14358 m_errorMonitor->VerifyFound();
14359}
14360
Chris Forbes870a39e2016-11-30 12:55:56 +130014361TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14362 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14363
Tony Barbour1fa09702017-03-16 12:09:08 -060014364 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14366
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014367 char const *vsSource =
14368 "#version 450\n"
14369 "out block { layout(location=0) mediump float x; };\n"
14370 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14371 char const *fsSource =
14372 "#version 450\n"
14373 "in block { layout(location=0) highp float x; };\n"
14374 "layout(location=0) out vec4 color;\n"
14375 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014376
14377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14379
14380 VkPipelineObj pipe(m_device);
14381 pipe.AddColorAttachment();
14382 pipe.AddShader(&vs);
14383 pipe.AddShader(&fs);
14384
14385 VkDescriptorSetObj descriptorSet(m_device);
14386 descriptorSet.AppendDummy();
14387 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14388
14389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14390
14391 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14392
14393 m_errorMonitor->VerifyFound();
14394}
14395
Karl Schultz6addd812016-02-02 17:17:23 -070014396TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014397 TEST_DESCRIPTION(
14398 "Test that a warning is produced for a vertex attribute which is "
14399 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014401
Tony Barbour1fa09702017-03-16 12:09:08 -060014402 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014404
14405 VkVertexInputBindingDescription input_binding;
14406 memset(&input_binding, 0, sizeof(input_binding));
14407
14408 VkVertexInputAttributeDescription input_attrib;
14409 memset(&input_attrib, 0, sizeof(input_attrib));
14410 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14411
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014412 char const *vsSource =
14413 "#version 450\n"
14414 "\n"
14415 "out gl_PerVertex {\n"
14416 " vec4 gl_Position;\n"
14417 "};\n"
14418 "void main(){\n"
14419 " gl_Position = vec4(1);\n"
14420 "}\n";
14421 char const *fsSource =
14422 "#version 450\n"
14423 "\n"
14424 "layout(location=0) out vec4 color;\n"
14425 "void main(){\n"
14426 " color = vec4(1);\n"
14427 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014428
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014429 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14430 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014431
14432 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014433 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014434 pipe.AddShader(&vs);
14435 pipe.AddShader(&fs);
14436
14437 pipe.AddVertexInputBindings(&input_binding, 1);
14438 pipe.AddVertexInputAttribs(&input_attrib, 1);
14439
Chris Forbesde136e02015-05-25 11:13:28 +120014440 VkDescriptorSetObj descriptorSet(m_device);
14441 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014442 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014443
Tony Barbour5781e8f2015-08-04 16:23:11 -060014444 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014445
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014446 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014447}
14448
Karl Schultz6addd812016-02-02 17:17:23 -070014449TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014450 TEST_DESCRIPTION(
14451 "Test that a warning is produced for a location mismatch on "
14452 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014454
Tony Barbour1fa09702017-03-16 12:09:08 -060014455 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14457
14458 VkVertexInputBindingDescription input_binding;
14459 memset(&input_binding, 0, sizeof(input_binding));
14460
14461 VkVertexInputAttributeDescription input_attrib;
14462 memset(&input_attrib, 0, sizeof(input_attrib));
14463 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14464
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014465 char const *vsSource =
14466 "#version 450\n"
14467 "\n"
14468 "layout(location=1) in float x;\n"
14469 "out gl_PerVertex {\n"
14470 " vec4 gl_Position;\n"
14471 "};\n"
14472 "void main(){\n"
14473 " gl_Position = vec4(x);\n"
14474 "}\n";
14475 char const *fsSource =
14476 "#version 450\n"
14477 "\n"
14478 "layout(location=0) out vec4 color;\n"
14479 "void main(){\n"
14480 " color = vec4(1);\n"
14481 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014482
14483 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14484 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14485
14486 VkPipelineObj pipe(m_device);
14487 pipe.AddColorAttachment();
14488 pipe.AddShader(&vs);
14489 pipe.AddShader(&fs);
14490
14491 pipe.AddVertexInputBindings(&input_binding, 1);
14492 pipe.AddVertexInputAttribs(&input_attrib, 1);
14493
14494 VkDescriptorSetObj descriptorSet(m_device);
14495 descriptorSet.AppendDummy();
14496 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14497
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014498 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014499 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14500
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014501 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014502}
14503
Karl Schultz6addd812016-02-02 17:17:23 -070014504TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014505 TEST_DESCRIPTION(
14506 "Test that an error is produced for a vertex shader input which is not "
14507 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14509 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014510
Tony Barbour1fa09702017-03-16 12:09:08 -060014511 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014514 char const *vsSource =
14515 "#version 450\n"
14516 "\n"
14517 "layout(location=0) in vec4 x;\n" /* not provided */
14518 "out gl_PerVertex {\n"
14519 " vec4 gl_Position;\n"
14520 "};\n"
14521 "void main(){\n"
14522 " gl_Position = x;\n"
14523 "}\n";
14524 char const *fsSource =
14525 "#version 450\n"
14526 "\n"
14527 "layout(location=0) out vec4 color;\n"
14528 "void main(){\n"
14529 " color = vec4(1);\n"
14530 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014531
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014532 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14533 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014534
14535 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014536 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014537 pipe.AddShader(&vs);
14538 pipe.AddShader(&fs);
14539
Chris Forbes62e8e502015-05-25 11:13:29 +120014540 VkDescriptorSetObj descriptorSet(m_device);
14541 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014542 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014543
Tony Barbour5781e8f2015-08-04 16:23:11 -060014544 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014545
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014546 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014547}
14548
Karl Schultz6addd812016-02-02 17:17:23 -070014549TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014550 TEST_DESCRIPTION(
14551 "Test that an error is produced for a mismatch between the "
14552 "fundamental type (float/int/uint) of an attribute and the "
14553 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014554 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 -060014555
Tony Barbour1fa09702017-03-16 12:09:08 -060014556 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014558
14559 VkVertexInputBindingDescription input_binding;
14560 memset(&input_binding, 0, sizeof(input_binding));
14561
14562 VkVertexInputAttributeDescription input_attrib;
14563 memset(&input_attrib, 0, sizeof(input_attrib));
14564 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14565
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014566 char const *vsSource =
14567 "#version 450\n"
14568 "\n"
14569 "layout(location=0) in int x;\n" /* attrib provided float */
14570 "out gl_PerVertex {\n"
14571 " vec4 gl_Position;\n"
14572 "};\n"
14573 "void main(){\n"
14574 " gl_Position = vec4(x);\n"
14575 "}\n";
14576 char const *fsSource =
14577 "#version 450\n"
14578 "\n"
14579 "layout(location=0) out vec4 color;\n"
14580 "void main(){\n"
14581 " color = vec4(1);\n"
14582 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014583
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14585 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014586
14587 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014588 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014589 pipe.AddShader(&vs);
14590 pipe.AddShader(&fs);
14591
14592 pipe.AddVertexInputBindings(&input_binding, 1);
14593 pipe.AddVertexInputAttribs(&input_attrib, 1);
14594
Chris Forbesc97d98e2015-05-25 11:13:31 +120014595 VkDescriptorSetObj descriptorSet(m_device);
14596 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014597 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014598
Tony Barbour5781e8f2015-08-04 16:23:11 -060014599 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014600
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014601 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014602}
14603
Chris Forbesc68b43c2016-04-06 11:18:47 +120014604TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014605 TEST_DESCRIPTION(
14606 "Test that an error is produced for a pipeline containing multiple "
14607 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14609 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014610
Tony Barbour1fa09702017-03-16 12:09:08 -060014611 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14613
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014614 char const *vsSource =
14615 "#version 450\n"
14616 "\n"
14617 "out gl_PerVertex {\n"
14618 " vec4 gl_Position;\n"
14619 "};\n"
14620 "void main(){\n"
14621 " gl_Position = vec4(1);\n"
14622 "}\n";
14623 char const *fsSource =
14624 "#version 450\n"
14625 "\n"
14626 "layout(location=0) out vec4 color;\n"
14627 "void main(){\n"
14628 " color = vec4(1);\n"
14629 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014630
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 VkPipelineObj pipe(m_device);
14635 pipe.AddColorAttachment();
14636 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014637 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014638 pipe.AddShader(&fs);
14639
14640 VkDescriptorSetObj descriptorSet(m_device);
14641 descriptorSet.AppendDummy();
14642 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14643
14644 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14645
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014646 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014647}
14648
Chris Forbes82ff92a2016-09-09 10:50:24 +120014649TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014651
Tony Barbour1fa09702017-03-16 12:09:08 -060014652 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014653 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14654
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014655 char const *vsSource =
14656 "#version 450\n"
14657 "out gl_PerVertex {\n"
14658 " vec4 gl_Position;\n"
14659 "};\n"
14660 "void main(){\n"
14661 " gl_Position = vec4(0);\n"
14662 "}\n";
14663 char const *fsSource =
14664 "#version 450\n"
14665 "\n"
14666 "layout(location=0) out vec4 color;\n"
14667 "void main(){\n"
14668 " color = vec4(1);\n"
14669 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014670
14671 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14672 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14673
14674 VkPipelineObj pipe(m_device);
14675 pipe.AddColorAttachment();
14676 pipe.AddShader(&vs);
14677 pipe.AddShader(&fs);
14678
14679 VkDescriptorSetObj descriptorSet(m_device);
14680 descriptorSet.AppendDummy();
14681 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14682
14683 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14684
14685 m_errorMonitor->VerifyFound();
14686}
14687
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014688TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14690 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14691 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014692
Tony Barbour1fa09702017-03-16 12:09:08 -060014693 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14695
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014696 char const *vsSource =
14697 "#version 450\n"
14698 "void main(){ gl_Position = vec4(0); }\n";
14699 char const *fsSource =
14700 "#version 450\n"
14701 "\n"
14702 "layout(location=0) out vec4 color;\n"
14703 "void main(){\n"
14704 " color = vec4(1);\n"
14705 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014706
14707 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14708 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14709
14710 VkPipelineObj pipe(m_device);
14711 pipe.AddColorAttachment();
14712 pipe.AddShader(&vs);
14713 pipe.AddShader(&fs);
14714
14715 VkDescriptorSetObj descriptorSet(m_device);
14716 descriptorSet.AppendDummy();
14717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14718
14719 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014720 {
14721 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14722 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14723 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014724 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014725 {
14726 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14727 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14728 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014729 },
14730 };
14731 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014732 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014733 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014734 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14735 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014736 VkRenderPass rp;
14737 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14738 ASSERT_VK_SUCCESS(err);
14739
14740 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14741
14742 m_errorMonitor->VerifyFound();
14743
14744 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14745}
14746
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014747TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014748 TEST_DESCRIPTION(
14749 "Test that an error is produced for a variable output from "
14750 "the TCS without the patch decoration, but consumed in the TES "
14751 "with the decoration.");
14752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14753 "is per-vertex in tessellation control shader stage "
14754 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014755
Tony Barbour1fa09702017-03-16 12:09:08 -060014756 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14758
Chris Forbesc1e852d2016-04-04 19:26:42 +120014759 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014760 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014761 return;
14762 }
14763
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014764 char const *vsSource =
14765 "#version 450\n"
14766 "void main(){}\n";
14767 char const *tcsSource =
14768 "#version 450\n"
14769 "layout(location=0) out int x[];\n"
14770 "layout(vertices=3) out;\n"
14771 "void main(){\n"
14772 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14773 " gl_TessLevelInner[0] = 1;\n"
14774 " x[gl_InvocationID] = gl_InvocationID;\n"
14775 "}\n";
14776 char const *tesSource =
14777 "#version 450\n"
14778 "layout(triangles, equal_spacing, cw) in;\n"
14779 "layout(location=0) patch in int x;\n"
14780 "out gl_PerVertex { vec4 gl_Position; };\n"
14781 "void main(){\n"
14782 " gl_Position.xyz = gl_TessCoord;\n"
14783 " gl_Position.w = x;\n"
14784 "}\n";
14785 char const *fsSource =
14786 "#version 450\n"
14787 "layout(location=0) out vec4 color;\n"
14788 "void main(){\n"
14789 " color = vec4(1);\n"
14790 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014791
14792 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14793 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14794 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14795 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14796
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014797 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14798 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014799
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014800 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014801
14802 VkPipelineObj pipe(m_device);
14803 pipe.SetInputAssembly(&iasci);
14804 pipe.SetTessellation(&tsci);
14805 pipe.AddColorAttachment();
14806 pipe.AddShader(&vs);
14807 pipe.AddShader(&tcs);
14808 pipe.AddShader(&tes);
14809 pipe.AddShader(&fs);
14810
14811 VkDescriptorSetObj descriptorSet(m_device);
14812 descriptorSet.AppendDummy();
14813 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14814
14815 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14816
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014817 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014818}
14819
Karl Schultz6addd812016-02-02 17:17:23 -070014820TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014821 TEST_DESCRIPTION(
14822 "Test that an error is produced for a vertex attribute setup where multiple "
14823 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14825 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014826
Tony Barbour1fa09702017-03-16 12:09:08 -060014827 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014829
14830 /* Two binding descriptions for binding 0 */
14831 VkVertexInputBindingDescription input_bindings[2];
14832 memset(input_bindings, 0, sizeof(input_bindings));
14833
14834 VkVertexInputAttributeDescription input_attrib;
14835 memset(&input_attrib, 0, sizeof(input_attrib));
14836 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14837
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014838 char const *vsSource =
14839 "#version 450\n"
14840 "\n"
14841 "layout(location=0) in float x;\n" /* attrib provided float */
14842 "out gl_PerVertex {\n"
14843 " vec4 gl_Position;\n"
14844 "};\n"
14845 "void main(){\n"
14846 " gl_Position = vec4(x);\n"
14847 "}\n";
14848 char const *fsSource =
14849 "#version 450\n"
14850 "\n"
14851 "layout(location=0) out vec4 color;\n"
14852 "void main(){\n"
14853 " color = vec4(1);\n"
14854 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014855
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014856 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14857 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014858
14859 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014860 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014861 pipe.AddShader(&vs);
14862 pipe.AddShader(&fs);
14863
14864 pipe.AddVertexInputBindings(input_bindings, 2);
14865 pipe.AddVertexInputAttribs(&input_attrib, 1);
14866
Chris Forbes280ba2c2015-06-12 11:16:41 +120014867 VkDescriptorSetObj descriptorSet(m_device);
14868 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014869 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014870
Tony Barbour5781e8f2015-08-04 16:23:11 -060014871 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014873 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014874}
Chris Forbes8f68b562015-05-25 11:13:32 +120014875
Karl Schultz6addd812016-02-02 17:17:23 -070014876TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014877 TEST_DESCRIPTION(
14878 "Test that an error is produced for a fragment shader which does not "
14879 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014881
Tony Barbour1fa09702017-03-16 12:09:08 -060014882 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014883
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014884 char const *vsSource =
14885 "#version 450\n"
14886 "\n"
14887 "out gl_PerVertex {\n"
14888 " vec4 gl_Position;\n"
14889 "};\n"
14890 "void main(){\n"
14891 " gl_Position = vec4(1);\n"
14892 "}\n";
14893 char const *fsSource =
14894 "#version 450\n"
14895 "\n"
14896 "void main(){\n"
14897 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014898
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014899 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14900 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014901
14902 VkPipelineObj pipe(m_device);
14903 pipe.AddShader(&vs);
14904 pipe.AddShader(&fs);
14905
Chia-I Wu08accc62015-07-07 11:50:03 +080014906 /* set up CB 0, not written */
14907 pipe.AddColorAttachment();
14908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014909
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014910 VkDescriptorSetObj descriptorSet(m_device);
14911 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014912 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014913
Tony Barbour5781e8f2015-08-04 16:23:11 -060014914 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014915
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014916 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014917}
14918
Karl Schultz6addd812016-02-02 17:17:23 -070014919TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014920 TEST_DESCRIPTION(
14921 "Test that a warning is produced for a fragment shader which provides a spurious "
14922 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014924 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014925
Tony Barbour1fa09702017-03-16 12:09:08 -060014926 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014927
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014928 char const *vsSource =
14929 "#version 450\n"
14930 "\n"
14931 "out gl_PerVertex {\n"
14932 " vec4 gl_Position;\n"
14933 "};\n"
14934 "void main(){\n"
14935 " gl_Position = vec4(1);\n"
14936 "}\n";
14937 char const *fsSource =
14938 "#version 450\n"
14939 "\n"
14940 "layout(location=0) out vec4 x;\n"
14941 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14942 "void main(){\n"
14943 " x = vec4(1);\n"
14944 " y = vec4(1);\n"
14945 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014946
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014949
14950 VkPipelineObj pipe(m_device);
14951 pipe.AddShader(&vs);
14952 pipe.AddShader(&fs);
14953
Chia-I Wu08accc62015-07-07 11:50:03 +080014954 /* set up CB 0, not written */
14955 pipe.AddColorAttachment();
14956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014957 /* FS writes CB 1, but we don't configure it */
14958
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014959 VkDescriptorSetObj descriptorSet(m_device);
14960 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014961 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014962
Tony Barbour5781e8f2015-08-04 16:23:11 -060014963 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014964
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014965 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014966}
14967
Karl Schultz6addd812016-02-02 17:17:23 -070014968TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014969 TEST_DESCRIPTION(
14970 "Test that an error is produced for a mismatch between the fundamental "
14971 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014973
Tony Barbour1fa09702017-03-16 12:09:08 -060014974 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014976 char const *vsSource =
14977 "#version 450\n"
14978 "\n"
14979 "out gl_PerVertex {\n"
14980 " vec4 gl_Position;\n"
14981 "};\n"
14982 "void main(){\n"
14983 " gl_Position = vec4(1);\n"
14984 "}\n";
14985 char const *fsSource =
14986 "#version 450\n"
14987 "\n"
14988 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14989 "void main(){\n"
14990 " x = ivec4(1);\n"
14991 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014992
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014993 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014995
14996 VkPipelineObj pipe(m_device);
14997 pipe.AddShader(&vs);
14998 pipe.AddShader(&fs);
14999
Chia-I Wu08accc62015-07-07 11:50:03 +080015000 /* set up CB 0; type is UNORM by default */
15001 pipe.AddColorAttachment();
15002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015003
Chris Forbesa36d69e2015-05-25 11:13:44 +120015004 VkDescriptorSetObj descriptorSet(m_device);
15005 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015006 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015007
Tony Barbour5781e8f2015-08-04 16:23:11 -060015008 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015009
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015010 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015011}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015012
Karl Schultz6addd812016-02-02 17:17:23 -070015013TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015014 TEST_DESCRIPTION(
15015 "Test that an error is produced for a shader consuming a uniform "
15016 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015018
Tony Barbour1fa09702017-03-16 12:09:08 -060015019 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015020
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015021 char const *vsSource =
15022 "#version 450\n"
15023 "\n"
15024 "out gl_PerVertex {\n"
15025 " vec4 gl_Position;\n"
15026 "};\n"
15027 "void main(){\n"
15028 " gl_Position = vec4(1);\n"
15029 "}\n";
15030 char const *fsSource =
15031 "#version 450\n"
15032 "\n"
15033 "layout(location=0) out vec4 x;\n"
15034 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15035 "void main(){\n"
15036 " x = vec4(bar.y);\n"
15037 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015038
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015039 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15040 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015041
Chris Forbes556c76c2015-08-14 12:04:59 +120015042 VkPipelineObj pipe(m_device);
15043 pipe.AddShader(&vs);
15044 pipe.AddShader(&fs);
15045
15046 /* set up CB 0; type is UNORM by default */
15047 pipe.AddColorAttachment();
15048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15049
15050 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015051 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015052
15053 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15054
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015055 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015056}
15057
Chris Forbes5c59e902016-02-26 16:56:09 +130015058TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015059 TEST_DESCRIPTION(
15060 "Test that an error is produced for a shader consuming push constants "
15061 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015063
Tony Barbour1fa09702017-03-16 12:09:08 -060015064 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015065
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015066 char const *vsSource =
15067 "#version 450\n"
15068 "\n"
15069 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15070 "out gl_PerVertex {\n"
15071 " vec4 gl_Position;\n"
15072 "};\n"
15073 "void main(){\n"
15074 " gl_Position = vec4(consts.x);\n"
15075 "}\n";
15076 char const *fsSource =
15077 "#version 450\n"
15078 "\n"
15079 "layout(location=0) out vec4 x;\n"
15080 "void main(){\n"
15081 " x = vec4(1);\n"
15082 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015083
15084 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15085 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15086
15087 VkPipelineObj pipe(m_device);
15088 pipe.AddShader(&vs);
15089 pipe.AddShader(&fs);
15090
15091 /* set up CB 0; type is UNORM by default */
15092 pipe.AddColorAttachment();
15093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15094
15095 VkDescriptorSetObj descriptorSet(m_device);
15096 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15097
15098 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15099
15100 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015101 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015102}
15103
Chris Forbes3fb17902016-08-22 14:57:55 +120015104TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015105 TEST_DESCRIPTION(
15106 "Test that an error is produced for a shader consuming an input attachment "
15107 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15109 "consumes input attachment index 0 but not provided in subpass");
15110
Tony Barbour1fa09702017-03-16 12:09:08 -060015111 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015112
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015113 char const *vsSource =
15114 "#version 450\n"
15115 "\n"
15116 "out gl_PerVertex {\n"
15117 " vec4 gl_Position;\n"
15118 "};\n"
15119 "void main(){\n"
15120 " gl_Position = vec4(1);\n"
15121 "}\n";
15122 char const *fsSource =
15123 "#version 450\n"
15124 "\n"
15125 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15126 "layout(location=0) out vec4 color;\n"
15127 "void main() {\n"
15128 " color = subpassLoad(x);\n"
15129 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015130
15131 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15132 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15133
15134 VkPipelineObj pipe(m_device);
15135 pipe.AddShader(&vs);
15136 pipe.AddShader(&fs);
15137 pipe.AddColorAttachment();
15138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015140 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15141 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015142 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015143 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015144 ASSERT_VK_SUCCESS(err);
15145
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015146 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015147 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015148 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015149 ASSERT_VK_SUCCESS(err);
15150
15151 // error here.
15152 pipe.CreateVKPipeline(pl, renderPass());
15153
15154 m_errorMonitor->VerifyFound();
15155
15156 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15157 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15158}
15159
Chris Forbes5a9a0472016-08-22 16:02:09 +120015160TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015161 TEST_DESCRIPTION(
15162 "Test that an error is produced for a shader consuming an input attachment "
15163 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15165 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15166
Tony Barbour1fa09702017-03-16 12:09:08 -060015167 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015168
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015169 char const *vsSource =
15170 "#version 450\n"
15171 "\n"
15172 "out gl_PerVertex {\n"
15173 " vec4 gl_Position;\n"
15174 "};\n"
15175 "void main(){\n"
15176 " gl_Position = vec4(1);\n"
15177 "}\n";
15178 char const *fsSource =
15179 "#version 450\n"
15180 "\n"
15181 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15182 "layout(location=0) out vec4 color;\n"
15183 "void main() {\n"
15184 " color = subpassLoad(x);\n"
15185 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015186
15187 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15189
15190 VkPipelineObj pipe(m_device);
15191 pipe.AddShader(&vs);
15192 pipe.AddShader(&fs);
15193 pipe.AddColorAttachment();
15194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15195
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015196 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15197 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015198 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015199 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015200 ASSERT_VK_SUCCESS(err);
15201
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015202 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015203 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015204 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015205 ASSERT_VK_SUCCESS(err);
15206
15207 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015208 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15209 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15210 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15211 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15212 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 +120015213 };
15214 VkAttachmentReference color = {
15215 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15216 };
15217 VkAttachmentReference input = {
15218 1, VK_IMAGE_LAYOUT_GENERAL,
15219 };
15220
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015221 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015223 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015224 VkRenderPass rp;
15225 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15226 ASSERT_VK_SUCCESS(err);
15227
15228 // error here.
15229 pipe.CreateVKPipeline(pl, rp);
15230
15231 m_errorMonitor->VerifyFound();
15232
15233 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15234 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15235 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15236}
15237
Chris Forbes541f7b02016-08-22 15:30:27 +120015238TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015239 TEST_DESCRIPTION(
15240 "Test that an error is produced for a shader consuming an input attachment "
15241 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015243 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015244
Tony Barbour1fa09702017-03-16 12:09:08 -060015245 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015246
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015247 char const *vsSource =
15248 "#version 450\n"
15249 "\n"
15250 "out gl_PerVertex {\n"
15251 " vec4 gl_Position;\n"
15252 "};\n"
15253 "void main(){\n"
15254 " gl_Position = vec4(1);\n"
15255 "}\n";
15256 char const *fsSource =
15257 "#version 450\n"
15258 "\n"
15259 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15260 "layout(location=0) out vec4 color;\n"
15261 "void main() {\n"
15262 " color = subpassLoad(xs[0]);\n"
15263 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015264
15265 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15266 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15267
15268 VkPipelineObj pipe(m_device);
15269 pipe.AddShader(&vs);
15270 pipe.AddShader(&fs);
15271 pipe.AddColorAttachment();
15272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15273
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015274 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15275 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015276 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015277 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015278 ASSERT_VK_SUCCESS(err);
15279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015280 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015281 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015282 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015283 ASSERT_VK_SUCCESS(err);
15284
15285 // error here.
15286 pipe.CreateVKPipeline(pl, renderPass());
15287
15288 m_errorMonitor->VerifyFound();
15289
15290 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15291 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15292}
15293
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015294TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015295 TEST_DESCRIPTION(
15296 "Test that an error is produced for a compute pipeline consuming a "
15297 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015299
Tony Barbour1fa09702017-03-16 12:09:08 -060015300 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015301
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015302 char const *csSource =
15303 "#version 450\n"
15304 "\n"
15305 "layout(local_size_x=1) in;\n"
15306 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15307 "void main(){\n"
15308 " x = vec4(1);\n"
15309 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015310
15311 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15312
15313 VkDescriptorSetObj descriptorSet(m_device);
15314 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15315
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015316 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15317 nullptr,
15318 0,
15319 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15320 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15321 descriptorSet.GetPipelineLayout(),
15322 VK_NULL_HANDLE,
15323 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015324
15325 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015326 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015327
15328 m_errorMonitor->VerifyFound();
15329
15330 if (err == VK_SUCCESS) {
15331 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15332 }
15333}
15334
Chris Forbes22a9b092016-07-19 14:34:05 +120015335TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015336 TEST_DESCRIPTION(
15337 "Test that an error is produced for a pipeline consuming a "
15338 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15340 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015341
Tony Barbour1fa09702017-03-16 12:09:08 -060015342 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15345 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015346 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015347 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015348 ASSERT_VK_SUCCESS(err);
15349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015350 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015351 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015352 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015353 ASSERT_VK_SUCCESS(err);
15354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015355 char const *csSource =
15356 "#version 450\n"
15357 "\n"
15358 "layout(local_size_x=1) in;\n"
15359 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15360 "void main() {\n"
15361 " x.x = 1.0f;\n"
15362 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015363 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15364
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015365 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15366 nullptr,
15367 0,
15368 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15369 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15370 pl,
15371 VK_NULL_HANDLE,
15372 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015373
15374 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015375 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015376
15377 m_errorMonitor->VerifyFound();
15378
15379 if (err == VK_SUCCESS) {
15380 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15381 }
15382
15383 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15384 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15385}
15386
Chris Forbes50020592016-07-27 13:52:41 +120015387TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015388 TEST_DESCRIPTION(
15389 "Test that an error is produced when an image view type "
15390 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015392 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 +120015393
Tony Barbour1fa09702017-03-16 12:09:08 -060015394 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15396
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015397 char const *vsSource =
15398 "#version 450\n"
15399 "\n"
15400 "out gl_PerVertex { vec4 gl_Position; };\n"
15401 "void main() { gl_Position = vec4(0); }\n";
15402 char const *fsSource =
15403 "#version 450\n"
15404 "\n"
15405 "layout(set=0, binding=0) uniform sampler3D s;\n"
15406 "layout(location=0) out vec4 color;\n"
15407 "void main() {\n"
15408 " color = texture(s, vec3(0));\n"
15409 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015410 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15411 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15412
15413 VkPipelineObj pipe(m_device);
15414 pipe.AddShader(&vs);
15415 pipe.AddShader(&fs);
15416 pipe.AddColorAttachment();
15417
15418 VkTextureObj texture(m_device, nullptr);
15419 VkSamplerObj sampler(m_device);
15420
15421 VkDescriptorSetObj descriptorSet(m_device);
15422 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15424
15425 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15426 ASSERT_VK_SUCCESS(err);
15427
Tony Barbour552f6c02016-12-21 14:34:07 -070015428 m_commandBuffer->BeginCommandBuffer();
15429 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015430
15431 m_commandBuffer->BindPipeline(pipe);
15432 m_commandBuffer->BindDescriptorSet(descriptorSet);
15433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015434 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015435 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015436 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015437 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15438
15439 // error produced here.
15440 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15441
15442 m_errorMonitor->VerifyFound();
15443
Tony Barbour552f6c02016-12-21 14:34:07 -070015444 m_commandBuffer->EndRenderPass();
15445 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015446}
15447
Chris Forbes5533bfc2016-07-27 14:12:34 +120015448TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015449 TEST_DESCRIPTION(
15450 "Test that an error is produced when a multisampled images "
15451 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015452
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015454
Tony Barbour1fa09702017-03-16 12:09:08 -060015455 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15457
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015458 char const *vsSource =
15459 "#version 450\n"
15460 "\n"
15461 "out gl_PerVertex { vec4 gl_Position; };\n"
15462 "void main() { gl_Position = vec4(0); }\n";
15463 char const *fsSource =
15464 "#version 450\n"
15465 "\n"
15466 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15467 "layout(location=0) out vec4 color;\n"
15468 "void main() {\n"
15469 " color = texelFetch(s, ivec2(0), 0);\n"
15470 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15473
15474 VkPipelineObj pipe(m_device);
15475 pipe.AddShader(&vs);
15476 pipe.AddShader(&fs);
15477 pipe.AddColorAttachment();
15478
15479 VkTextureObj texture(m_device, nullptr);
15480 VkSamplerObj sampler(m_device);
15481
15482 VkDescriptorSetObj descriptorSet(m_device);
15483 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15485
15486 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15487 ASSERT_VK_SUCCESS(err);
15488
Tony Barbour552f6c02016-12-21 14:34:07 -070015489 m_commandBuffer->BeginCommandBuffer();
15490 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015491
15492 m_commandBuffer->BindPipeline(pipe);
15493 m_commandBuffer->BindDescriptorSet(descriptorSet);
15494
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015495 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015496 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015497 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015498 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15499
15500 // error produced here.
15501 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15502
15503 m_errorMonitor->VerifyFound();
15504
Tony Barbour552f6c02016-12-21 14:34:07 -070015505 m_commandBuffer->EndRenderPass();
15506 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015507}
15508
Mark Youngc48c4c12016-04-11 14:26:49 -060015509TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015511
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015512 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15513 {
15514 VkFormatProperties properties;
15515 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15516 if (properties.optimalTilingFeatures == 0) {
15517 printf(" Image format not supported; skipped.\n");
15518 return;
15519 }
15520 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015521
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015522 VkImageCreateInfo info = {};
15523 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15524 info.pNext = NULL;
15525 info.imageType = VK_IMAGE_TYPE_2D;
15526 info.format = format;
15527 info.extent.height = 32;
15528 info.extent.depth = 1;
15529 info.mipLevels = 1;
15530 info.arrayLayers = 1;
15531 info.samples = VK_SAMPLE_COUNT_1_BIT;
15532 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15533 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15534 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015535
15536 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015537 {
15538 VkImageFormatProperties properties;
15539 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15540 info.tiling, info.usage, info.flags, &properties);
15541 ASSERT_VK_SUCCESS(result);
15542 info.extent.width = properties.maxExtent.width + 1;
15543 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015544
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015545 VkImage image;
15546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15547 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015548 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015549}
15550
Mark Youngc48c4c12016-04-11 14:26:49 -060015551TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015552 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015553
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015554 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15555 {
15556 VkFormatProperties properties;
15557 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15558 if (properties.optimalTilingFeatures == 0) {
15559 printf(" Image format not supported; skipped.\n");
15560 return;
15561 }
15562 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015563
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015564 VkImageCreateInfo info = {};
15565 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15566 info.pNext = NULL;
15567 info.imageType = VK_IMAGE_TYPE_2D;
15568 info.format = format;
15569 info.extent.height = 32;
15570 info.extent.depth = 1;
15571 info.mipLevels = 1;
15572 info.arrayLayers = 1;
15573 info.samples = VK_SAMPLE_COUNT_1_BIT;
15574 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15575 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15576 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015577
15578 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015579 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015580
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015581 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015583 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15584 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015585 m_errorMonitor->VerifyFound();
15586}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015587
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015588TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015589 TEST_DESCRIPTION(
15590 "Create a render pass with an attachment description "
15591 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015592
Tony Barbour1fa09702017-03-16 12:09:08 -060015593 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15595
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015597
15598 VkAttachmentReference color_attach = {};
15599 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15600 color_attach.attachment = 0;
15601 VkSubpassDescription subpass = {};
15602 subpass.colorAttachmentCount = 1;
15603 subpass.pColorAttachments = &color_attach;
15604
15605 VkRenderPassCreateInfo rpci = {};
15606 rpci.subpassCount = 1;
15607 rpci.pSubpasses = &subpass;
15608 rpci.attachmentCount = 1;
15609 VkAttachmentDescription attach_desc = {};
15610 attach_desc.format = VK_FORMAT_UNDEFINED;
15611 rpci.pAttachments = &attach_desc;
15612 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15613 VkRenderPass rp;
15614 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15615
15616 m_errorMonitor->VerifyFound();
15617
15618 if (result == VK_SUCCESS) {
15619 vkDestroyRenderPass(m_device->device(), rp, NULL);
15620 }
15621}
15622
Karl Schultz6addd812016-02-02 17:17:23 -070015623TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015624 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015625
Mike Stroyana3082432015-09-25 13:39:21 -060015626 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015627 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15628 const int32_t tex_width = 32;
15629 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015630
15631 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015632 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15633 image_create_info.pNext = NULL;
15634 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15635 image_create_info.format = tex_format;
15636 image_create_info.extent.width = tex_width;
15637 image_create_info.extent.height = tex_height;
15638 image_create_info.extent.depth = 1;
15639 image_create_info.mipLevels = 1;
15640 image_create_info.arrayLayers = 1;
15641 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15642 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15643 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15644 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015645
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015646 VkImage image;
15647 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015648 ASSERT_VK_SUCCESS(err);
15649
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015650 VkMemoryRequirements requirements;
15651 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15652
15653 VkMemoryAllocateInfo alloc_info{};
15654 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15655 alloc_info.pNext = NULL;
15656 alloc_info.memoryTypeIndex = 0;
15657 alloc_info.allocationSize = requirements.size;
15658 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15659 ASSERT_TRUE(pass);
15660
15661 VkDeviceMemory memory;
15662 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15663 ASSERT_VK_SUCCESS(err);
15664
15665 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15666
Tobin Ehliscde08892015-09-22 10:11:37 -060015667 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015668 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015669 image_view_create_info.image = image;
15670 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15671 image_view_create_info.format = tex_format;
15672 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015673 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015674 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015675 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015676
15677 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015679 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015680 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015681
15682 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015683 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015684}
Mike Stroyana3082432015-09-25 13:39:21 -060015685
Mark Youngd339ba32016-05-30 13:28:35 -060015686TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15687 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015689 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015690
Tony Barbour1fa09702017-03-16 12:09:08 -060015691 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015692
15693 // Create an image and try to create a view with no memory backing the image
15694 VkImage image;
15695
15696 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15697 const int32_t tex_width = 32;
15698 const int32_t tex_height = 32;
15699
15700 VkImageCreateInfo image_create_info = {};
15701 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15702 image_create_info.pNext = NULL;
15703 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15704 image_create_info.format = tex_format;
15705 image_create_info.extent.width = tex_width;
15706 image_create_info.extent.height = tex_height;
15707 image_create_info.extent.depth = 1;
15708 image_create_info.mipLevels = 1;
15709 image_create_info.arrayLayers = 1;
15710 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15711 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15712 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15713 image_create_info.flags = 0;
15714
15715 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15716 ASSERT_VK_SUCCESS(err);
15717
15718 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015719 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015720 image_view_create_info.image = image;
15721 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15722 image_view_create_info.format = tex_format;
15723 image_view_create_info.subresourceRange.layerCount = 1;
15724 image_view_create_info.subresourceRange.baseMipLevel = 0;
15725 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015726 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015727
15728 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015729 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015730
15731 m_errorMonitor->VerifyFound();
15732 vkDestroyImage(m_device->device(), image, NULL);
15733 // If last error is success, it still created the view, so delete it.
15734 if (err == VK_SUCCESS) {
15735 vkDestroyImageView(m_device->device(), view, NULL);
15736 }
Mark Youngd339ba32016-05-30 13:28:35 -060015737}
15738
Karl Schultz6addd812016-02-02 17:17:23 -070015739TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015740 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015742
Tony Barbour1fa09702017-03-16 12:09:08 -060015743 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015744
Karl Schultz6addd812016-02-02 17:17:23 -070015745 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015746 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015747 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015748 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015749
15750 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015751 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015752 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015753 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15754 image_view_create_info.format = tex_format;
15755 image_view_create_info.subresourceRange.baseMipLevel = 0;
15756 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015757 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015758 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015759 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015760
15761 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015762 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015763
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015764 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015765}
15766
Mike Weiblena1e13f42017-02-09 21:25:59 -070015767TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15768 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15769
Tony Barbour1fa09702017-03-16 12:09:08 -060015770 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015771 VkSubresourceLayout subres_layout = {};
15772
15773 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15774 {
15775 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15776 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015777 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015778 ASSERT_TRUE(img.initialized());
15779
15780 VkImageSubresource subres = {};
15781 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15782 subres.mipLevel = 0;
15783 subres.arrayLayer = 0;
15784
15785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15786 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15787 m_errorMonitor->VerifyFound();
15788 }
15789
15790 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15791 {
15792 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015793 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015794 ASSERT_TRUE(img.initialized());
15795
15796 VkImageSubresource subres = {};
15797 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15798 subres.mipLevel = 0;
15799 subres.arrayLayer = 0;
15800
15801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15803 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15804 m_errorMonitor->VerifyFound();
15805 }
15806
15807 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15808 {
15809 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015810 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015811 ASSERT_TRUE(img.initialized());
15812
15813 VkImageSubresource subres = {};
15814 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15815 subres.mipLevel = 1; // ERROR: triggers VU 00739
15816 subres.arrayLayer = 0;
15817
15818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15819 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15820 m_errorMonitor->VerifyFound();
15821 }
15822
15823 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15824 {
15825 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015826 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015827 ASSERT_TRUE(img.initialized());
15828
15829 VkImageSubresource subres = {};
15830 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15831 subres.mipLevel = 0;
15832 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15833
15834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15835 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15836 m_errorMonitor->VerifyFound();
15837 }
15838}
15839
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015840TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015841 VkResult err;
15842 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015843
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015845
Tony Barbour1fa09702017-03-16 12:09:08 -060015846 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015847
15848 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015849 VkImage srcImage;
15850 VkImage dstImage;
15851 VkDeviceMemory srcMem;
15852 VkDeviceMemory destMem;
15853 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015854
15855 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015856 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15857 image_create_info.pNext = NULL;
15858 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15859 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15860 image_create_info.extent.width = 32;
15861 image_create_info.extent.height = 32;
15862 image_create_info.extent.depth = 1;
15863 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015864 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015865 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15866 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15867 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15868 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015869
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015870 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015871 ASSERT_VK_SUCCESS(err);
15872
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015873 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015874 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015875 ASSERT_VK_SUCCESS(err);
15876
15877 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015878 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015879 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15880 memAlloc.pNext = NULL;
15881 memAlloc.allocationSize = 0;
15882 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015883
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015884 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015885 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015886 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015887 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015888 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015889 ASSERT_VK_SUCCESS(err);
15890
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015891 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015892 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015893 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015894 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015895 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015896 ASSERT_VK_SUCCESS(err);
15897
15898 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15899 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015900 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015901 ASSERT_VK_SUCCESS(err);
15902
Tony Barbour552f6c02016-12-21 14:34:07 -070015903 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015904 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015905 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015906 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015907 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015908 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015909 copyRegion.srcOffset.x = 0;
15910 copyRegion.srcOffset.y = 0;
15911 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015912 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015913 copyRegion.dstSubresource.mipLevel = 0;
15914 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015915 // Introduce failure by forcing the dst layerCount to differ from src
15916 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015917 copyRegion.dstOffset.x = 0;
15918 copyRegion.dstOffset.y = 0;
15919 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015920 copyRegion.extent.width = 1;
15921 copyRegion.extent.height = 1;
15922 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015923 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015924 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015925
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015926 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015927
Chia-I Wuf7458c52015-10-26 21:10:41 +080015928 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015929 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015930 vkFreeMemory(m_device->device(), srcMem, NULL);
15931 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015932}
15933
Tony Barbourd6673642016-05-05 14:46:39 -060015934TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015935 TEST_DESCRIPTION("Creating images with unsuported formats ");
15936
Tony Barbour1fa09702017-03-16 12:09:08 -060015937 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015939
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015940 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015941 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015943 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15944 image_create_info.format = VK_FORMAT_UNDEFINED;
15945 image_create_info.extent.width = 32;
15946 image_create_info.extent.height = 32;
15947 image_create_info.extent.depth = 1;
15948 image_create_info.mipLevels = 1;
15949 image_create_info.arrayLayers = 1;
15950 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15951 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15952 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015953
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15955 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015956
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015957 VkImage image;
15958 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015959 m_errorMonitor->VerifyFound();
15960
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015961 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015962 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015963 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15964 VkFormat format = static_cast<VkFormat>(f);
15965 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015966 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015967 unsupported = format;
15968 break;
15969 }
15970 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015971
Tony Barbourd6673642016-05-05 14:46:39 -060015972 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015973 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015975
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015976 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015977 m_errorMonitor->VerifyFound();
15978 }
15979}
15980
15981TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015982 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15983
Tony Barbour1fa09702017-03-16 12:09:08 -060015984 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060015985 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015986 if (!depth_format) {
15987 return;
15988 }
Tony Barbourd6673642016-05-05 14:46:39 -060015989
15990 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015991 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 -060015992 VK_IMAGE_TILING_OPTIMAL, 0);
15993 ASSERT_TRUE(image.initialized());
15994
15995 VkImageView imgView;
15996 VkImageViewCreateInfo imgViewInfo = {};
15997 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15998 imgViewInfo.image = image.handle();
15999 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16000 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16001 imgViewInfo.subresourceRange.layerCount = 1;
16002 imgViewInfo.subresourceRange.baseMipLevel = 0;
16003 imgViewInfo.subresourceRange.levelCount = 1;
16004 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16005
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016006 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016007 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016009 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16010 m_errorMonitor->VerifyFound();
16011 imgViewInfo.subresourceRange.baseMipLevel = 0;
16012
Tony Barbourd6673642016-05-05 14:46:39 -060016013 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16014 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016016 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16017 m_errorMonitor->VerifyFound();
16018 imgViewInfo.subresourceRange.levelCount = 1;
16019
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016020 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16021 imgViewInfo.subresourceRange.levelCount = 2;
16022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16023 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16024 m_errorMonitor->VerifyFound();
16025 imgViewInfo.subresourceRange.levelCount = 1;
16026
16027 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16028 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16030 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16031 m_errorMonitor->VerifyFound();
16032 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16033
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016034 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16035 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016036 m_errorMonitor->SetDesiredFailureMsg(
16037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16038 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016039 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16040 m_errorMonitor->VerifyFound();
16041 imgViewInfo.subresourceRange.layerCount = 1;
16042
Tony Barbourd6673642016-05-05 14:46:39 -060016043 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016044 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016045 m_errorMonitor->SetDesiredFailureMsg(
16046 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16047 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016048 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16049 m_errorMonitor->VerifyFound();
16050 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16051
Tony Barbourd6673642016-05-05 14:46:39 -060016052 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16053 // VIEW_CREATE_ERROR
16054 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016056 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16057 m_errorMonitor->VerifyFound();
16058 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16059
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016060 // TODO: Update framework to easily passing mutable flag into ImageObj init
16061 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016062 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16063 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16064 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016065 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16066 // VIEW_CREATE_ERROR
16067 VkImageCreateInfo mutImgInfo = image.create_info();
16068 VkImage mutImage;
16069 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016070 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016071 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16072 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016073 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016074 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016075
16076 VkMemoryRequirements requirements;
16077 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16078
16079 VkMemoryAllocateInfo alloc_info{};
16080 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16081 alloc_info.pNext = NULL;
16082 alloc_info.memoryTypeIndex = 0;
16083 alloc_info.allocationSize = requirements.size;
16084 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16085 ASSERT_TRUE(pass);
16086
16087 VkDeviceMemory memory;
16088 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16089 ASSERT_VK_SUCCESS(ret);
16090
16091 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16092 ASSERT_VK_SUCCESS(ret);
16093
Tony Barbourd6673642016-05-05 14:46:39 -060016094 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016096 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16097 m_errorMonitor->VerifyFound();
16098 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016099
16100 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016101 vkDestroyImage(m_device->handle(), mutImage, NULL);
16102}
16103
Dave Houlton75967fc2017-03-06 17:21:16 -070016104TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16105 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16106
Tony Barbour1fa09702017-03-16 12:09:08 -060016107 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016108
Jamie Madill35127872017-03-15 16:17:46 -040016109 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016110 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16111 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16112 if (device_features.textureCompressionBC) {
16113 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16114 } else if (device_features.textureCompressionETC2) {
16115 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16116 } else if (device_features.textureCompressionASTC_LDR) {
16117 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16118 } else {
16119 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16120 return;
16121 }
16122
16123 VkImageCreateInfo ci;
16124 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16125 ci.pNext = NULL;
16126 ci.flags = 0;
16127 ci.imageType = VK_IMAGE_TYPE_2D;
16128 ci.format = compressed_format;
16129 ci.extent = {32, 32, 1};
16130 ci.mipLevels = 6;
16131 ci.arrayLayers = 1;
16132 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16133 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16134 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16135 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16136 ci.queueFamilyIndexCount = 0;
16137 ci.pQueueFamilyIndices = NULL;
16138 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16139
16140 VkImageObj image(m_device);
16141 image.init(&ci);
16142 ASSERT_TRUE(image.initialized());
16143
16144 VkImageObj odd_image(m_device);
16145 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16146 odd_image.init(&ci);
16147 ASSERT_TRUE(odd_image.initialized());
16148
16149 // Allocate buffers
16150 VkMemoryPropertyFlags reqs = 0;
16151 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16152 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16153 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16154 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16155 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16156
16157 VkBufferImageCopy region = {};
16158 region.bufferRowLength = 0;
16159 region.bufferImageHeight = 0;
16160 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16161 region.imageSubresource.layerCount = 1;
16162 region.imageOffset = {0, 0, 0};
16163 region.bufferOffset = 0;
16164
16165 // start recording
16166 m_commandBuffer->BeginCommandBuffer();
16167
16168 // Mip level copies that work - 5 levels
16169 m_errorMonitor->ExpectSuccess();
16170
16171 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16172 region.imageExtent = {32, 32, 1};
16173 region.imageSubresource.mipLevel = 0;
16174 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16175 &region);
16176 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16177 &region);
16178
16179 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16180 region.imageExtent = {8, 8, 1};
16181 region.imageSubresource.mipLevel = 2;
16182 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16183 &region);
16184 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16185 &region);
16186
16187 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16188 region.imageExtent = {4, 4, 1};
16189 region.imageSubresource.mipLevel = 3;
16190 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16191 &region);
16192 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16193 &region);
16194
16195 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16196 region.imageExtent = {2, 2, 1};
16197 region.imageSubresource.mipLevel = 4;
16198 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16199 &region);
16200 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16201 &region);
16202
16203 region.imageExtent = {1, 1, 1};
16204 region.imageSubresource.mipLevel = 5;
16205 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16206 &region);
16207 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16208 &region);
16209 m_errorMonitor->VerifyNotFound();
16210
16211 // Buffer must accomodate a full compressed block, regardless of texel count
16212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16213 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16214 &region);
16215 m_errorMonitor->VerifyFound();
16216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16217 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16218 &region);
16219 m_errorMonitor->VerifyFound();
16220
16221 // Copy width < compressed block size, but not the full mip width
16222 region.imageExtent = {1, 2, 1};
16223 region.imageSubresource.mipLevel = 4;
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16225 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16226 &region);
16227 m_errorMonitor->VerifyFound();
16228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16229 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16230 &region);
16231 m_errorMonitor->VerifyFound();
16232
16233 // Copy height < compressed block size but not the full mip height
16234 region.imageExtent = {2, 1, 1};
16235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16236 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16237 &region);
16238 m_errorMonitor->VerifyFound();
16239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16240 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16241 &region);
16242 m_errorMonitor->VerifyFound();
16243
16244 // Offsets must be multiple of compressed block size
16245 region.imageOffset = {1, 1, 0};
16246 region.imageExtent = {1, 1, 1};
16247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16248 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16249 &region);
16250 m_errorMonitor->VerifyFound();
16251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16252 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16253 &region);
16254 m_errorMonitor->VerifyFound();
16255
16256 // Offset + extent width = mip width - should succeed
16257 region.imageOffset = {4, 4, 0};
16258 region.imageExtent = {3, 4, 1};
16259 region.imageSubresource.mipLevel = 2;
16260 m_errorMonitor->ExpectSuccess();
16261 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16262 &region);
16263 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16264 &region);
16265 m_errorMonitor->VerifyNotFound();
16266
16267 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16268 region.imageExtent = {4, 4, 1};
16269 m_errorMonitor->ExpectSuccess();
16270 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16271 &region);
16272 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16273 &region);
16274 m_errorMonitor->VerifyNotFound();
16275
16276 // Offset + extent width < mip width and not a multiple of block width - should fail
16277 region.imageExtent = {3, 3, 1};
16278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16279 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16280 &region);
16281 m_errorMonitor->VerifyFound();
16282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16283 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16284 &region);
16285 m_errorMonitor->VerifyFound();
16286}
16287
Dave Houlton59a20702017-02-02 17:26:23 -070016288TEST_F(VkLayerTest, ImageBufferCopyTests) {
16289 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16290
Tony Barbour1fa09702017-03-16 12:09:08 -060016291 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016292 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16293 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16294 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16295 return;
16296 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016297
16298 // Bail if any dimension of transfer granularity is 0.
16299 auto index = m_device->graphics_queue_node_index_;
16300 auto queue_family_properties = m_device->phy().queue_properties();
16301 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16302 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16303 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16304 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16305 return;
16306 }
16307
Dave Houlton59a20702017-02-02 17:26:23 -070016308 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16309 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16310 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016311 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16312 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16313 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16314 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16315
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016316 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016317 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16318 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016319 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016320 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16321 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016322 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 -070016323 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016324 ASSERT_TRUE(image_64k.initialized());
16325 ASSERT_TRUE(image_16k.initialized());
16326 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016327
Dave Houltonf3229d52017-02-21 15:59:08 -070016328 // Verify all needed Depth/Stencil formats are supported
16329 bool missing_ds_support = false;
16330 VkFormatProperties props = {0, 0, 0};
16331 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16332 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16333 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16334 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16335 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16336 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16337 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16338 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16339
16340 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016341 ds_image_4D_1S.Init(
16342 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016343 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16344 VK_IMAGE_TILING_OPTIMAL, 0);
16345 ASSERT_TRUE(ds_image_4D_1S.initialized());
16346
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016347 ds_image_3D_1S.Init(
16348 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016349 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16350 VK_IMAGE_TILING_OPTIMAL, 0);
16351 ASSERT_TRUE(ds_image_3D_1S.initialized());
16352
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016353 ds_image_2D.Init(256, 256, 1, VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16354 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16355 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016356 ASSERT_TRUE(ds_image_2D.initialized());
16357
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016358 ds_image_1S.Init(256, 256, 1, VK_FORMAT_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16359 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16360 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016361 ASSERT_TRUE(ds_image_1S.initialized());
16362 }
16363
16364 // Allocate buffers
16365 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016366 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016367 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16368 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16369 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16370 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016371
16372 VkBufferImageCopy region = {};
16373 region.bufferRowLength = 0;
16374 region.bufferImageHeight = 0;
16375 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16376 region.imageSubresource.layerCount = 1;
16377 region.imageOffset = {0, 0, 0};
16378 region.imageExtent = {64, 64, 1};
16379 region.bufferOffset = 0;
16380
16381 // attempt copies before putting command buffer in recording state
16382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16384 &region);
16385 m_errorMonitor->VerifyFound();
16386
16387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16389 &region);
16390 m_errorMonitor->VerifyFound();
16391
16392 // start recording
16393 m_commandBuffer->BeginCommandBuffer();
16394
16395 // successful copies
16396 m_errorMonitor->ExpectSuccess();
16397 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16398 &region);
16399 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16400 &region);
16401 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16402 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16403 &region);
16404 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 region.imageOffset.x = 0;
16408 region.imageExtent.height = 64;
16409 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16410 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16411 &region);
16412 m_errorMonitor->VerifyNotFound();
16413
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016414 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016415 region.imageExtent = {65, 64, 1};
16416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16417 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16418 &region);
16419 m_errorMonitor->VerifyFound();
16420
16421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16422 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16423 &region);
16424 m_errorMonitor->VerifyFound();
16425
16426 // image/buffer too small (offset) on copy to image
16427 region.imageExtent = {64, 64, 1};
16428 region.imageOffset = {0, 4, 0};
16429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16430 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16431 &region);
16432 m_errorMonitor->VerifyFound();
16433
16434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16435 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16436 &region);
16437 m_errorMonitor->VerifyFound();
16438
16439 // image/buffer too small on copy to buffer
16440 region.imageExtent = {64, 64, 1};
16441 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016442 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16444 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16445 &region);
16446 m_errorMonitor->VerifyFound();
16447
16448 region.imageExtent = {64, 65, 1};
16449 region.bufferOffset = 0;
16450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16451 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16452 &region);
16453 m_errorMonitor->VerifyFound();
16454
16455 // buffer size ok but rowlength causes loose packing
16456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16457 region.imageExtent = {64, 64, 1};
16458 region.bufferRowLength = 68;
16459 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16460 &region);
16461 m_errorMonitor->VerifyFound();
16462
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016463 // An extent with zero area should produce a warning, but no error
16464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16465 region.imageExtent.width = 0;
16466 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16467 &region);
16468 m_errorMonitor->VerifyFound();
16469
Dave Houlton59a20702017-02-02 17:26:23 -070016470 // aspect bits
16471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16472 region.imageExtent = {64, 64, 1};
16473 region.bufferRowLength = 0;
16474 region.bufferImageHeight = 0;
16475 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16476 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16477 buffer_16k.handle(), 1, &region);
16478 m_errorMonitor->VerifyFound();
16479
16480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16481 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16482 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16483 &region);
16484 m_errorMonitor->VerifyFound();
16485
16486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16487 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16488 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16489 buffer_16k.handle(), 1, &region);
16490 m_errorMonitor->VerifyFound();
16491
Dave Houltonf3229d52017-02-21 15:59:08 -070016492 // Test Depth/Stencil copies
16493 if (missing_ds_support) {
16494 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16495 } else {
16496 VkBufferImageCopy ds_region = {};
16497 ds_region.bufferOffset = 0;
16498 ds_region.bufferRowLength = 0;
16499 ds_region.bufferImageHeight = 0;
16500 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16501 ds_region.imageSubresource.mipLevel = 0;
16502 ds_region.imageSubresource.baseArrayLayer = 0;
16503 ds_region.imageSubresource.layerCount = 1;
16504 ds_region.imageOffset = {0, 0, 0};
16505 ds_region.imageExtent = {256, 256, 1};
16506
16507 // Depth copies that should succeed
16508 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16509 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16510 buffer_256k.handle(), 1, &ds_region);
16511 m_errorMonitor->VerifyNotFound();
16512
16513 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16514 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16515 buffer_256k.handle(), 1, &ds_region);
16516 m_errorMonitor->VerifyNotFound();
16517
16518 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16519 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16520 buffer_128k.handle(), 1, &ds_region);
16521 m_errorMonitor->VerifyNotFound();
16522
16523 // Depth copies that should fail
16524 ds_region.bufferOffset = 4;
16525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16526 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16527 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16528 buffer_256k.handle(), 1, &ds_region);
16529 m_errorMonitor->VerifyFound();
16530
16531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16532 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16533 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16534 buffer_256k.handle(), 1, &ds_region);
16535 m_errorMonitor->VerifyFound();
16536
16537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16538 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16539 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16540 buffer_128k.handle(), 1, &ds_region);
16541 m_errorMonitor->VerifyFound();
16542
16543 // Stencil copies that should succeed
16544 ds_region.bufferOffset = 0;
16545 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16546 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16547 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16548 buffer_64k.handle(), 1, &ds_region);
16549 m_errorMonitor->VerifyNotFound();
16550
16551 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16552 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16553 buffer_64k.handle(), 1, &ds_region);
16554 m_errorMonitor->VerifyNotFound();
16555
16556 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16557 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16558 buffer_64k.handle(), 1, &ds_region);
16559 m_errorMonitor->VerifyNotFound();
16560
16561 // Stencil copies that should fail
16562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16563 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16564 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16565 buffer_16k.handle(), 1, &ds_region);
16566 m_errorMonitor->VerifyFound();
16567
16568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16569 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16570 ds_region.bufferRowLength = 260;
16571 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16572 buffer_64k.handle(), 1, &ds_region);
16573 m_errorMonitor->VerifyFound();
16574
16575 ds_region.bufferRowLength = 0;
16576 ds_region.bufferOffset = 4;
16577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16578 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16579 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16580 buffer_64k.handle(), 1, &ds_region);
16581 m_errorMonitor->VerifyFound();
16582 }
16583
Dave Houlton584d51e2017-02-16 12:52:54 -070016584 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016585 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016586 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016587 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16588 device_features.textureCompressionASTC_LDR)) {
16589 printf(" No compressed formats supported - block compression tests skipped.\n");
16590 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016591 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16592 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016593 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016594 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16595 0);
16596 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 -070016597 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016598 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016599 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 -070016600 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016601 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 -070016602 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016603 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016604 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 -070016605 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016606 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 -070016607 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016608 }
16609 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016610
Dave Houlton584d51e2017-02-16 12:52:54 -070016611 // Just fits
16612 m_errorMonitor->ExpectSuccess();
16613 region.imageExtent = {128, 128, 1};
16614 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16615 buffer_16k.handle(), 1, &region);
16616 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016617
Dave Houlton584d51e2017-02-16 12:52:54 -070016618 // with offset, too big for buffer
16619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16620 region.bufferOffset = 16;
16621 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16622 buffer_16k.handle(), 1, &region);
16623 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016624 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016625
Dave Houlton67e9b532017-03-02 17:00:10 -070016626 // extents that are not a multiple of compressed block size
16627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16628 region.imageExtent.width = 66;
16629 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16630 buffer_16k.handle(), 1, &region);
16631 m_errorMonitor->VerifyFound();
16632 region.imageExtent.width = 128;
16633
16634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016635 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016636 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16637 buffer_16k.handle(), 1, &region);
16638 m_errorMonitor->VerifyFound();
16639 region.imageExtent.height = 128;
16640
16641 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16642
16643 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16644 m_errorMonitor->ExpectSuccess();
16645 region.imageExtent.width = 66;
16646 region.imageOffset.x = 64;
16647 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16648 buffer_16k.handle(), 1, &region);
16649 region.imageExtent.width = 16;
16650 region.imageOffset.x = 0;
16651 region.imageExtent.height = 2;
16652 region.imageOffset.y = 128;
16653 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016654 buffer_16k.handle(), 1, &region);
16655 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016656 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016657
Dave Houlton584d51e2017-02-16 12:52:54 -070016658 // buffer offset must be a multiple of texel block size (16)
16659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16661 region.imageExtent = {64, 64, 1};
16662 region.bufferOffset = 24;
16663 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16664 buffer_16k.handle(), 1, &region);
16665 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016666
Dave Houlton584d51e2017-02-16 12:52:54 -070016667 // rowlength not a multiple of block width (4)
16668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16669 region.bufferOffset = 0;
16670 region.bufferRowLength = 130;
16671 region.bufferImageHeight = 0;
16672 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16673 buffer_64k.handle(), 1, &region);
16674 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016675
Dave Houlton584d51e2017-02-16 12:52:54 -070016676 // imageheight not a multiple of block height (4)
16677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16678 region.bufferRowLength = 0;
16679 region.bufferImageHeight = 130;
16680 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16681 buffer_64k.handle(), 1, &region);
16682 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016683 }
Dave Houlton59a20702017-02-02 17:26:23 -070016684}
16685
Tony Barbourd6673642016-05-05 14:46:39 -060016686TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016687 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016688
Tony Barbour1fa09702017-03-16 12:09:08 -060016689 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016690
Rene Lindsay135204f2016-12-22 17:11:09 -070016691 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016692 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016693 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 -070016694 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016695 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016696 vk_testing::Buffer buffer;
16697 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016698 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016699 VkBufferImageCopy region = {};
16700 region.bufferRowLength = 128;
16701 region.bufferImageHeight = 128;
16702 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16703 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016704 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016705 region.imageExtent.height = 4;
16706 region.imageExtent.width = 4;
16707 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016708
16709 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016710 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 -070016711 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016712 ASSERT_TRUE(image2.initialized());
16713 vk_testing::Buffer buffer2;
16714 VkMemoryPropertyFlags reqs2 = 0;
16715 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16716 VkBufferImageCopy region2 = {};
16717 region2.bufferRowLength = 128;
16718 region2.bufferImageHeight = 128;
16719 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16720 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16721 region2.imageSubresource.layerCount = 1;
16722 region2.imageExtent.height = 4;
16723 region2.imageExtent.width = 4;
16724 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016725 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016726
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016727 // Image must have offset.z of 0 and extent.depth of 1
16728 // Introduce failure by setting imageExtent.depth to 0
16729 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016731 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016732 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016733 m_errorMonitor->VerifyFound();
16734
16735 region.imageExtent.depth = 1;
16736
16737 // Image must have offset.z of 0 and extent.depth of 1
16738 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016739 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016740 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016743 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016744 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016745 m_errorMonitor->VerifyFound();
16746
16747 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016748 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16749 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016750 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016752 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16753 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016754 m_errorMonitor->VerifyFound();
16755
16756 // BufferOffset must be a multiple of 4
16757 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016758 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016760 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16761 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016762 m_errorMonitor->VerifyFound();
16763
16764 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16765 region.bufferOffset = 0;
16766 region.imageExtent.height = 128;
16767 region.imageExtent.width = 128;
16768 // Introduce failure by setting bufferRowLength > 0 but less than width
16769 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016771 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16772 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016773 m_errorMonitor->VerifyFound();
16774
16775 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16776 region.bufferRowLength = 128;
16777 // Introduce failure by setting bufferRowHeight > 0 but less than height
16778 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016780 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16781 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016782 m_errorMonitor->VerifyFound();
16783
16784 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016785 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016786 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 -070016787 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016788 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016789 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 -070016790 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016791 VkImageBlit blitRegion = {};
16792 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16793 blitRegion.srcSubresource.baseArrayLayer = 0;
16794 blitRegion.srcSubresource.layerCount = 1;
16795 blitRegion.srcSubresource.mipLevel = 0;
16796 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16797 blitRegion.dstSubresource.baseArrayLayer = 0;
16798 blitRegion.dstSubresource.layerCount = 1;
16799 blitRegion.dstSubresource.mipLevel = 0;
16800
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016801 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16803 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16805 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016806 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
16807 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016808 m_errorMonitor->VerifyFound();
16809
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016811 VkImageMemoryBarrier img_barrier;
16812 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16813 img_barrier.pNext = NULL;
16814 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16815 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16816 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16817 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16818 img_barrier.image = image.handle();
16819 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16820 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16821 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16822 img_barrier.subresourceRange.baseArrayLayer = 0;
16823 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016824 img_barrier.subresourceRange.layerCount = 0;
16825 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016826 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16827 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016828 m_errorMonitor->VerifyFound();
16829 img_barrier.subresourceRange.layerCount = 1;
16830}
16831
16832TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016833 TEST_DESCRIPTION("Exceed the limits of image format ");
16834
Tony Barbour1fa09702017-03-16 12:09:08 -060016835 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016836
16837 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16838 {
16839 VkFormatProperties properties;
16840 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16841 if (properties.linearTilingFeatures == 0) {
16842 printf(" Image format not supported; skipped.\n");
16843 return;
16844 }
16845 }
16846
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016848 VkImageCreateInfo image_create_info = {};
16849 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16850 image_create_info.pNext = NULL;
16851 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016852 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016853 image_create_info.extent.width = 32;
16854 image_create_info.extent.height = 32;
16855 image_create_info.extent.depth = 1;
16856 image_create_info.mipLevels = 1;
16857 image_create_info.arrayLayers = 1;
16858 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16859 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16860 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16861 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16862 image_create_info.flags = 0;
16863
16864 VkImage nullImg;
16865 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016866 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16867 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016868 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016869 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16870 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16871 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016872 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016873
Tony Barbour0907e362017-03-09 15:05:30 -070016874 uint32_t maxDim =
16875 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16876 // If max mip levels exceeds image extents, skip the max mip levels test
16877 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16879 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16880 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16881 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16882 m_errorMonitor->VerifyFound();
16883 image_create_info.mipLevels = 1;
16884 }
Tony Barbourd6673642016-05-05 14:46:39 -060016885
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016887 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16888 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16889 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16890 m_errorMonitor->VerifyFound();
16891 image_create_info.arrayLayers = 1;
16892
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016894 int samples = imgFmtProps.sampleCounts >> 1;
16895 image_create_info.samples = (VkSampleCountFlagBits)samples;
16896 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16897 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16898 m_errorMonitor->VerifyFound();
16899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16900
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16902 "pCreateInfo->initialLayout, must be "
16903 "VK_IMAGE_LAYOUT_UNDEFINED or "
16904 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016905 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16906 // Expect INVALID_LAYOUT
16907 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16908 m_errorMonitor->VerifyFound();
16909 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16910}
16911
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016912TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016913 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016915
Tony Barbour1fa09702017-03-16 12:09:08 -060016916 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016917
16918 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016919 src_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016920 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016921 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016922
Tony Barbour552f6c02016-12-21 14:34:07 -070016923 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016924 VkImageCopy copy_region;
16925 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16926 copy_region.srcSubresource.mipLevel = 0;
16927 copy_region.srcSubresource.baseArrayLayer = 0;
16928 copy_region.srcSubresource.layerCount = 0;
16929 copy_region.srcOffset.x = 0;
16930 copy_region.srcOffset.y = 0;
16931 copy_region.srcOffset.z = 0;
16932 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16933 copy_region.dstSubresource.mipLevel = 0;
16934 copy_region.dstSubresource.baseArrayLayer = 0;
16935 copy_region.dstSubresource.layerCount = 0;
16936 copy_region.dstOffset.x = 0;
16937 copy_region.dstOffset.y = 0;
16938 copy_region.dstOffset.z = 0;
16939 copy_region.extent.width = 64;
16940 copy_region.extent.height = 64;
16941 copy_region.extent.depth = 1;
16942 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16943 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016944 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016945
16946 m_errorMonitor->VerifyFound();
16947}
16948
16949TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016950 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016952
Tony Barbour1fa09702017-03-16 12:09:08 -060016953 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016954
16955 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016956 src_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016957 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016958 dst_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016959
Tony Barbour552f6c02016-12-21 14:34:07 -070016960 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016961 VkImageCopy copy_region;
16962 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16963 copy_region.srcSubresource.mipLevel = 0;
16964 copy_region.srcSubresource.baseArrayLayer = 0;
16965 copy_region.srcSubresource.layerCount = 0;
16966 copy_region.srcOffset.x = 0;
16967 copy_region.srcOffset.y = 0;
16968 copy_region.srcOffset.z = 0;
16969 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16970 copy_region.dstSubresource.mipLevel = 0;
16971 copy_region.dstSubresource.baseArrayLayer = 0;
16972 copy_region.dstSubresource.layerCount = 0;
16973 copy_region.dstOffset.x = 0;
16974 copy_region.dstOffset.y = 0;
16975 copy_region.dstOffset.z = 0;
16976 copy_region.extent.width = 64;
16977 copy_region.extent.height = 64;
16978 copy_region.extent.depth = 1;
16979 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16980 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016981 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016982
16983 m_errorMonitor->VerifyFound();
16984}
16985
Karl Schultz6addd812016-02-02 17:17:23 -070016986TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016987 VkResult err;
16988 bool pass;
16989
16990 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016992
Tony Barbour1fa09702017-03-16 12:09:08 -060016993 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016994
16995 // Create two images of different types and try to copy between them
16996 VkImage srcImage;
16997 VkImage dstImage;
16998 VkDeviceMemory srcMem;
16999 VkDeviceMemory destMem;
17000 VkMemoryRequirements memReqs;
17001
17002 VkImageCreateInfo image_create_info = {};
17003 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17004 image_create_info.pNext = NULL;
17005 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17006 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17007 image_create_info.extent.width = 32;
17008 image_create_info.extent.height = 32;
17009 image_create_info.extent.depth = 1;
17010 image_create_info.mipLevels = 1;
17011 image_create_info.arrayLayers = 1;
17012 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17013 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17014 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17015 image_create_info.flags = 0;
17016
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017017 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017018 ASSERT_VK_SUCCESS(err);
17019
17020 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17021 // Introduce failure by creating second image with a different-sized format.
17022 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017023 VkFormatProperties properties;
17024 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17025 if (properties.optimalTilingFeatures == 0) {
17026 printf(" Image format not supported; skipped.\n");
17027 return;
17028 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017029
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017030 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017031 ASSERT_VK_SUCCESS(err);
17032
17033 // Allocate memory
17034 VkMemoryAllocateInfo memAlloc = {};
17035 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17036 memAlloc.pNext = NULL;
17037 memAlloc.allocationSize = 0;
17038 memAlloc.memoryTypeIndex = 0;
17039
17040 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17041 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017042 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017043 ASSERT_TRUE(pass);
17044 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17045 ASSERT_VK_SUCCESS(err);
17046
17047 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17048 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017049 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017050 ASSERT_TRUE(pass);
17051 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17052 ASSERT_VK_SUCCESS(err);
17053
17054 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17055 ASSERT_VK_SUCCESS(err);
17056 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17057 ASSERT_VK_SUCCESS(err);
17058
Tony Barbour552f6c02016-12-21 14:34:07 -070017059 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017060 VkImageCopy copyRegion;
17061 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17062 copyRegion.srcSubresource.mipLevel = 0;
17063 copyRegion.srcSubresource.baseArrayLayer = 0;
17064 copyRegion.srcSubresource.layerCount = 0;
17065 copyRegion.srcOffset.x = 0;
17066 copyRegion.srcOffset.y = 0;
17067 copyRegion.srcOffset.z = 0;
17068 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17069 copyRegion.dstSubresource.mipLevel = 0;
17070 copyRegion.dstSubresource.baseArrayLayer = 0;
17071 copyRegion.dstSubresource.layerCount = 0;
17072 copyRegion.dstOffset.x = 0;
17073 copyRegion.dstOffset.y = 0;
17074 copyRegion.dstOffset.z = 0;
17075 copyRegion.extent.width = 1;
17076 copyRegion.extent.height = 1;
17077 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017078 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017079 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017080
17081 m_errorMonitor->VerifyFound();
17082
17083 vkDestroyImage(m_device->device(), srcImage, NULL);
17084 vkDestroyImage(m_device->device(), dstImage, NULL);
17085 vkFreeMemory(m_device->device(), srcMem, NULL);
17086 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017087}
17088
Karl Schultz6addd812016-02-02 17:17:23 -070017089TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17090 VkResult err;
17091 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017092
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017093 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17095 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017096
Tony Barbour1fa09702017-03-16 12:09:08 -060017097 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017098 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017099 if (!depth_format) {
17100 return;
17101 }
Mike Stroyana3082432015-09-25 13:39:21 -060017102
17103 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017104 VkImage srcImage;
17105 VkImage dstImage;
17106 VkDeviceMemory srcMem;
17107 VkDeviceMemory destMem;
17108 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017109
17110 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017111 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17112 image_create_info.pNext = NULL;
17113 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017114 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017115 image_create_info.extent.width = 32;
17116 image_create_info.extent.height = 32;
17117 image_create_info.extent.depth = 1;
17118 image_create_info.mipLevels = 1;
17119 image_create_info.arrayLayers = 1;
17120 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17121 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17122 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17123 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017124 VkFormatProperties properties;
17125 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17126 if (properties.optimalTilingFeatures == 0) {
17127 printf(" Image format not supported; skipped.\n");
17128 return;
17129 }
Mike Stroyana3082432015-09-25 13:39:21 -060017130
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017131 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017132 ASSERT_VK_SUCCESS(err);
17133
Karl Schultzbdb75952016-04-19 11:36:49 -060017134 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17135
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017136 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017137 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017138 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017139 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017140
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017141 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017142 ASSERT_VK_SUCCESS(err);
17143
17144 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017145 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017146 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17147 memAlloc.pNext = NULL;
17148 memAlloc.allocationSize = 0;
17149 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017150
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017151 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017152 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017153 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017154 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017155 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017156 ASSERT_VK_SUCCESS(err);
17157
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017158 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017159 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017160 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017161 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017162 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017163 ASSERT_VK_SUCCESS(err);
17164
17165 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17166 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017167 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017168 ASSERT_VK_SUCCESS(err);
17169
Tony Barbour552f6c02016-12-21 14:34:07 -070017170 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017171 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017172 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017173 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017174 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017175 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017176 copyRegion.srcOffset.x = 0;
17177 copyRegion.srcOffset.y = 0;
17178 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017179 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017180 copyRegion.dstSubresource.mipLevel = 0;
17181 copyRegion.dstSubresource.baseArrayLayer = 0;
17182 copyRegion.dstSubresource.layerCount = 0;
17183 copyRegion.dstOffset.x = 0;
17184 copyRegion.dstOffset.y = 0;
17185 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017186 copyRegion.extent.width = 1;
17187 copyRegion.extent.height = 1;
17188 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017189 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017190 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017191
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017192 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017193
Chia-I Wuf7458c52015-10-26 21:10:41 +080017194 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017195 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017196 vkFreeMemory(m_device->device(), srcMem, NULL);
17197 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017198}
17199
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017200TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17201 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017202
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017203 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017204
17205 VkImageFormatProperties image_format_properties;
17206 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17207 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17208 &image_format_properties);
17209
17210 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17211 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17212 printf(" Image multi-sample support not found; skipped.\n");
17213 return;
17214 }
17215
17216 VkImageCreateInfo ci;
17217 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17218 ci.pNext = NULL;
17219 ci.flags = 0;
17220 ci.imageType = VK_IMAGE_TYPE_2D;
17221 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17222 ci.extent = {128, 128, 1};
17223 ci.mipLevels = 1;
17224 ci.arrayLayers = 1;
17225 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17226 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17227 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17228 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17229 ci.queueFamilyIndexCount = 0;
17230 ci.pQueueFamilyIndices = NULL;
17231 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17232
17233 VkImageObj image1(m_device);
17234 image1.init(&ci);
17235 ASSERT_TRUE(image1.initialized());
17236
17237 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17238 VkImageObj image2(m_device);
17239 image2.init(&ci);
17240 ASSERT_TRUE(image2.initialized());
17241
17242 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17243 VkImageObj image4(m_device);
17244 image4.init(&ci);
17245 ASSERT_TRUE(image4.initialized());
17246
17247 m_commandBuffer->BeginCommandBuffer();
17248
17249 VkImageCopy copyRegion;
17250 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17251 copyRegion.srcSubresource.mipLevel = 0;
17252 copyRegion.srcSubresource.baseArrayLayer = 0;
17253 copyRegion.srcSubresource.layerCount = 1;
17254 copyRegion.srcOffset = {0, 0, 0};
17255 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17256 copyRegion.dstSubresource.mipLevel = 0;
17257 copyRegion.dstSubresource.baseArrayLayer = 0;
17258 copyRegion.dstSubresource.layerCount = 1;
17259 copyRegion.dstOffset = {0, 0, 0};
17260 copyRegion.extent = {128, 128, 1};
17261
17262 // Copy a single sample image to/from a multi-sample image
17263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17264 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17265 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17266 m_errorMonitor->VerifyFound();
17267
17268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17269 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17270 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17271 m_errorMonitor->VerifyFound();
17272
17273 // Copy between multi-sample images with different sample counts
17274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17275 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17276 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17277 m_errorMonitor->VerifyFound();
17278
17279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17280 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17281 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17282 m_errorMonitor->VerifyFound();
17283
17284 m_commandBuffer->EndCommandBuffer();
17285}
17286
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017287TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17288 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017289 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017290 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017291 if (!ds_format) {
17292 return;
17293 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017294
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017295 VkFormatProperties properties;
17296 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17297 if (properties.optimalTilingFeatures == 0) {
17298 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17299 return;
17300 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017301 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017302 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17303 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17304 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17305 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017306 ASSERT_TRUE(color_image.initialized());
17307 ASSERT_TRUE(depth_image.initialized());
17308 ASSERT_TRUE(ds_image.initialized());
17309
17310 VkImageCopy copyRegion;
17311 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17312 copyRegion.srcSubresource.mipLevel = 0;
17313 copyRegion.srcSubresource.baseArrayLayer = 0;
17314 copyRegion.srcSubresource.layerCount = 1;
17315 copyRegion.srcOffset = {0, 0, 0};
17316 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17317 copyRegion.dstSubresource.mipLevel = 0;
17318 copyRegion.dstSubresource.baseArrayLayer = 0;
17319 copyRegion.dstSubresource.layerCount = 1;
17320 copyRegion.dstOffset = {64, 0, 0};
17321 copyRegion.extent = {64, 128, 1};
17322
17323 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17325 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17326 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17327 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017328 m_errorMonitor->VerifyFound();
17329
17330 m_commandBuffer->BeginCommandBuffer();
17331
17332 // Src and dest aspect masks don't match
17333 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017335 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17336 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017337 m_errorMonitor->VerifyFound();
17338 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17339
17340 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017341 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017342 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17344 // These aspect/format mismatches are redundant but unavoidable here
17345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017347 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17348 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017349 m_errorMonitor->VerifyFound();
17350 // Metadata aspect is illegal - VU 01222
17351 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17352 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17354 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017355 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17356 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017357 m_errorMonitor->VerifyFound();
17358
17359 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17360 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17361
17362 // Aspect mask doesn't match source image format - VU 01200
17363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17364 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17366 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17367 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17368 m_errorMonitor->VerifyFound();
17369
17370 // Aspect mask doesn't match dest image format - VU 01201
17371 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17372 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17374 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17376 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17377 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17378 m_errorMonitor->VerifyFound();
17379
17380 m_commandBuffer->EndCommandBuffer();
17381}
17382
Karl Schultz6addd812016-02-02 17:17:23 -070017383TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17384 VkResult err;
17385 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017386
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17388 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017389
Tony Barbour1fa09702017-03-16 12:09:08 -060017390 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017391
17392 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017393 VkImage srcImage;
17394 VkImage dstImage;
17395 VkDeviceMemory srcMem;
17396 VkDeviceMemory destMem;
17397 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017398
17399 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017400 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17401 image_create_info.pNext = NULL;
17402 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17403 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17404 image_create_info.extent.width = 32;
17405 image_create_info.extent.height = 1;
17406 image_create_info.extent.depth = 1;
17407 image_create_info.mipLevels = 1;
17408 image_create_info.arrayLayers = 1;
17409 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17410 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17411 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17412 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017414 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017415 ASSERT_VK_SUCCESS(err);
17416
Karl Schultz6addd812016-02-02 17:17:23 -070017417 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017418
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017419 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017420 ASSERT_VK_SUCCESS(err);
17421
17422 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017423 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017424 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17425 memAlloc.pNext = NULL;
17426 memAlloc.allocationSize = 0;
17427 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017428
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017429 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017430 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017431 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017432 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017433 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017434 ASSERT_VK_SUCCESS(err);
17435
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017436 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017437 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017438 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017439 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017440 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017441 ASSERT_VK_SUCCESS(err);
17442
17443 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17444 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017445 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017446 ASSERT_VK_SUCCESS(err);
17447
Tony Barbour552f6c02016-12-21 14:34:07 -070017448 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017449 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017450 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17451 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017452 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017453 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017454 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017455 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017456 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017457 resolveRegion.srcOffset.x = 0;
17458 resolveRegion.srcOffset.y = 0;
17459 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017460 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017461 resolveRegion.dstSubresource.mipLevel = 0;
17462 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017463 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017464 resolveRegion.dstOffset.x = 0;
17465 resolveRegion.dstOffset.y = 0;
17466 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017467 resolveRegion.extent.width = 1;
17468 resolveRegion.extent.height = 1;
17469 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017470 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017471 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017472
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017473 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017474
Chia-I Wuf7458c52015-10-26 21:10:41 +080017475 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017476 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017477 vkFreeMemory(m_device->device(), srcMem, NULL);
17478 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017479}
17480
Karl Schultz6addd812016-02-02 17:17:23 -070017481TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17482 VkResult err;
17483 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17486 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017487
Tony Barbour1fa09702017-03-16 12:09:08 -060017488 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017489
Chris Forbesa7530692016-05-08 12:35:39 +120017490 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017491 VkImage srcImage;
17492 VkImage dstImage;
17493 VkDeviceMemory srcMem;
17494 VkDeviceMemory destMem;
17495 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017496
17497 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017498 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17499 image_create_info.pNext = NULL;
17500 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17501 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17502 image_create_info.extent.width = 32;
17503 image_create_info.extent.height = 1;
17504 image_create_info.extent.depth = 1;
17505 image_create_info.mipLevels = 1;
17506 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017507 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017508 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17509 // Note: Some implementations expect color attachment usage for any
17510 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017511 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017512 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017514 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017515 ASSERT_VK_SUCCESS(err);
17516
Karl Schultz6addd812016-02-02 17:17:23 -070017517 // Note: Some implementations expect color attachment usage for any
17518 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017519 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017520
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017521 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017522 ASSERT_VK_SUCCESS(err);
17523
17524 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017525 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017526 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17527 memAlloc.pNext = NULL;
17528 memAlloc.allocationSize = 0;
17529 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017530
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017531 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017532 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017533 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017534 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017535 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017536 ASSERT_VK_SUCCESS(err);
17537
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017538 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017539 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017540 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017541 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017542 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017543 ASSERT_VK_SUCCESS(err);
17544
17545 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17546 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017547 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017548 ASSERT_VK_SUCCESS(err);
17549
Tony Barbour552f6c02016-12-21 14:34:07 -070017550 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017551 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017552 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17553 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017554 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017555 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017556 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017557 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017558 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017559 resolveRegion.srcOffset.x = 0;
17560 resolveRegion.srcOffset.y = 0;
17561 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017562 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017563 resolveRegion.dstSubresource.mipLevel = 0;
17564 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017565 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017566 resolveRegion.dstOffset.x = 0;
17567 resolveRegion.dstOffset.y = 0;
17568 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017569 resolveRegion.extent.width = 1;
17570 resolveRegion.extent.height = 1;
17571 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017572 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017573 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017574
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017575 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017576
Chia-I Wuf7458c52015-10-26 21:10:41 +080017577 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017578 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017579 vkFreeMemory(m_device->device(), srcMem, NULL);
17580 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017581}
17582
Karl Schultz6addd812016-02-02 17:17:23 -070017583TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17584 VkResult err;
17585 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017586
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017588 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017589
Tony Barbour1fa09702017-03-16 12:09:08 -060017590 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017591
17592 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017593 VkImage srcImage;
17594 VkImage dstImage;
17595 VkDeviceMemory srcMem;
17596 VkDeviceMemory destMem;
17597 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017598
17599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17601 image_create_info.pNext = NULL;
17602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17603 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17604 image_create_info.extent.width = 32;
17605 image_create_info.extent.height = 1;
17606 image_create_info.extent.depth = 1;
17607 image_create_info.mipLevels = 1;
17608 image_create_info.arrayLayers = 1;
17609 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17611 // Note: Some implementations expect color attachment usage for any
17612 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017613 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017614 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017616 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017617 ASSERT_VK_SUCCESS(err);
17618
Karl Schultz6addd812016-02-02 17:17:23 -070017619 // Set format to something other than source image
17620 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17621 // Note: Some implementations expect color attachment usage for any
17622 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017623 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017626 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017627 ASSERT_VK_SUCCESS(err);
17628
17629 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017630 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017631 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17632 memAlloc.pNext = NULL;
17633 memAlloc.allocationSize = 0;
17634 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017635
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017636 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017637 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017638 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017639 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017640 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017641 ASSERT_VK_SUCCESS(err);
17642
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017643 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017644 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017645 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017646 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017647 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017648 ASSERT_VK_SUCCESS(err);
17649
17650 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17651 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017652 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017653 ASSERT_VK_SUCCESS(err);
17654
Tony Barbour552f6c02016-12-21 14:34:07 -070017655 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017656 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017657 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17658 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017659 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017660 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017661 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017662 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017663 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017664 resolveRegion.srcOffset.x = 0;
17665 resolveRegion.srcOffset.y = 0;
17666 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017667 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017668 resolveRegion.dstSubresource.mipLevel = 0;
17669 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017670 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017671 resolveRegion.dstOffset.x = 0;
17672 resolveRegion.dstOffset.y = 0;
17673 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017674 resolveRegion.extent.width = 1;
17675 resolveRegion.extent.height = 1;
17676 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017677 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017678 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017679
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017680 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017681
Chia-I Wuf7458c52015-10-26 21:10:41 +080017682 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017683 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017684 vkFreeMemory(m_device->device(), srcMem, NULL);
17685 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017686}
17687
Karl Schultz6addd812016-02-02 17:17:23 -070017688TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17689 VkResult err;
17690 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017691
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017693 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017694
Tony Barbour1fa09702017-03-16 12:09:08 -060017695 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017696
17697 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017698 VkImage srcImage;
17699 VkImage dstImage;
17700 VkDeviceMemory srcMem;
17701 VkDeviceMemory destMem;
17702 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017703
17704 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017705 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17706 image_create_info.pNext = NULL;
17707 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17708 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17709 image_create_info.extent.width = 32;
17710 image_create_info.extent.height = 1;
17711 image_create_info.extent.depth = 1;
17712 image_create_info.mipLevels = 1;
17713 image_create_info.arrayLayers = 1;
17714 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17715 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17716 // Note: Some implementations expect color attachment usage for any
17717 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017718 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017719 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017720
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017721 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017722 ASSERT_VK_SUCCESS(err);
17723
Karl Schultz6addd812016-02-02 17:17:23 -070017724 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17725 // Note: Some implementations expect color attachment usage for any
17726 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017727 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017728 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017729
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017730 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017731 ASSERT_VK_SUCCESS(err);
17732
17733 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017734 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017735 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17736 memAlloc.pNext = NULL;
17737 memAlloc.allocationSize = 0;
17738 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017739
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017740 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017741 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017742 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017743 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017744 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017745 ASSERT_VK_SUCCESS(err);
17746
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017747 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017748 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017749 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017750 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017751 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017752 ASSERT_VK_SUCCESS(err);
17753
17754 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17755 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017756 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017757 ASSERT_VK_SUCCESS(err);
17758
Tony Barbour552f6c02016-12-21 14:34:07 -070017759 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017760 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017761 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17762 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017763 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017764 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017765 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017766 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017767 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017768 resolveRegion.srcOffset.x = 0;
17769 resolveRegion.srcOffset.y = 0;
17770 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017771 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017772 resolveRegion.dstSubresource.mipLevel = 0;
17773 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017774 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017775 resolveRegion.dstOffset.x = 0;
17776 resolveRegion.dstOffset.y = 0;
17777 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017778 resolveRegion.extent.width = 1;
17779 resolveRegion.extent.height = 1;
17780 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017781 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017782 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017783
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017784 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017785
Chia-I Wuf7458c52015-10-26 21:10:41 +080017786 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017787 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017788 vkFreeMemory(m_device->device(), srcMem, NULL);
17789 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017790}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017791
Karl Schultz6addd812016-02-02 17:17:23 -070017792TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017793 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017794 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17795 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017796 // The image format check comes 2nd in validation so we trigger it first,
17797 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017798 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017799
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17801 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017802
Tony Barbour1fa09702017-03-16 12:09:08 -060017803 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017804 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017805 if (!depth_format) {
17806 return;
17807 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017808
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017809 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017810 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17811 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017812
17813 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017814 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17815 ds_pool_ci.pNext = NULL;
17816 ds_pool_ci.maxSets = 1;
17817 ds_pool_ci.poolSizeCount = 1;
17818 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819
17820 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017821 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017822 ASSERT_VK_SUCCESS(err);
17823
17824 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017825 dsl_binding.binding = 0;
17826 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17827 dsl_binding.descriptorCount = 1;
17828 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17829 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017830
17831 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017832 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17833 ds_layout_ci.pNext = NULL;
17834 ds_layout_ci.bindingCount = 1;
17835 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017836 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017837 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017838 ASSERT_VK_SUCCESS(err);
17839
17840 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017841 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017842 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017843 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017844 alloc_info.descriptorPool = ds_pool;
17845 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017846 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017847 ASSERT_VK_SUCCESS(err);
17848
Karl Schultz6addd812016-02-02 17:17:23 -070017849 VkImage image_bad;
17850 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017851 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017852 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017853 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017854 const int32_t tex_width = 32;
17855 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017856
17857 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017858 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17859 image_create_info.pNext = NULL;
17860 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17861 image_create_info.format = tex_format_bad;
17862 image_create_info.extent.width = tex_width;
17863 image_create_info.extent.height = tex_height;
17864 image_create_info.extent.depth = 1;
17865 image_create_info.mipLevels = 1;
17866 image_create_info.arrayLayers = 1;
17867 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17868 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017869 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017870 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017871
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017872 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017873 ASSERT_VK_SUCCESS(err);
17874 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017875 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17876 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017877 ASSERT_VK_SUCCESS(err);
17878
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017879 // ---Bind image memory---
17880 VkMemoryRequirements img_mem_reqs;
17881 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17882 VkMemoryAllocateInfo image_alloc_info = {};
17883 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17884 image_alloc_info.pNext = NULL;
17885 image_alloc_info.memoryTypeIndex = 0;
17886 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017887 bool pass =
17888 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 -070017889 ASSERT_TRUE(pass);
17890 VkDeviceMemory mem;
17891 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17892 ASSERT_VK_SUCCESS(err);
17893 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17894 ASSERT_VK_SUCCESS(err);
17895 // -----------------------
17896
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017897 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017898 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017899 image_view_create_info.image = image_bad;
17900 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17901 image_view_create_info.format = tex_format_bad;
17902 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17903 image_view_create_info.subresourceRange.baseMipLevel = 0;
17904 image_view_create_info.subresourceRange.layerCount = 1;
17905 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017906 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017907
17908 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017909 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017910
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017911 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017912
Chia-I Wuf7458c52015-10-26 21:10:41 +080017913 vkDestroyImage(m_device->device(), image_bad, NULL);
17914 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017915 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17916 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017917
17918 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017919}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017920
17921TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017922 TEST_DESCRIPTION(
17923 "Call ClearColorImage w/ a depth|stencil image and "
17924 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017925
Tony Barbour1fa09702017-03-16 12:09:08 -060017926 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017927 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017928 if (!depth_format) {
17929 return;
17930 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17932
Tony Barbour552f6c02016-12-21 14:34:07 -070017933 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017934
17935 // Color image
17936 VkClearColorValue clear_color;
17937 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17938 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17939 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17940 const int32_t img_width = 32;
17941 const int32_t img_height = 32;
17942 VkImageCreateInfo image_create_info = {};
17943 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17944 image_create_info.pNext = NULL;
17945 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17946 image_create_info.format = color_format;
17947 image_create_info.extent.width = img_width;
17948 image_create_info.extent.height = img_height;
17949 image_create_info.extent.depth = 1;
17950 image_create_info.mipLevels = 1;
17951 image_create_info.arrayLayers = 1;
17952 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17953 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17954 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17955
17956 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017957 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017958
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017959 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017960
17961 // Depth/Stencil image
17962 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017963 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017964 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17965 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017966 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017967 ds_image_create_info.extent.width = 64;
17968 ds_image_create_info.extent.height = 64;
17969 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017970 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 -060017971
17972 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017973 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017974
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017975 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 -060017976
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017978
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017979 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017980 &color_range);
17981
17982 m_errorMonitor->VerifyFound();
17983
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17985 "vkCmdClearColorImage called with "
17986 "image created without "
17987 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017988
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017989 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017990 &color_range);
17991
17992 m_errorMonitor->VerifyFound();
17993
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017994 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17996 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017997
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017998 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17999 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018000
18001 m_errorMonitor->VerifyFound();
18002}
Tobin Ehliscde08892015-09-22 10:11:37 -060018003
Mike Schuchardt35fece12017-03-07 14:40:28 -070018004TEST_F(VkLayerTest, CommandQueueFlags) {
18005 TEST_DESCRIPTION(
18006 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18007 "graphics-only command");
18008
18009 ASSERT_NO_FATAL_FAILURE(Init());
18010
18011 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018012 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018013 printf(" Non-graphics queue family not found; skipped.\n");
18014 return;
18015 } else {
18016 // Create command pool on a non-graphics queue
18017 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18018
18019 // Setup command buffer on pool
18020 VkCommandBufferObj command_buffer(m_device, &command_pool);
18021 command_buffer.BeginCommandBuffer();
18022
18023 // Issue a graphics only command
18024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18025 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18026 command_buffer.SetViewport(0, 1, &viewport);
18027 m_errorMonitor->VerifyFound();
18028 }
18029}
18030
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018031// WSI Enabled Tests
18032//
Chris Forbes09368e42016-10-13 11:59:22 +130018033#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018034TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18035
18036#if defined(VK_USE_PLATFORM_XCB_KHR)
18037 VkSurfaceKHR surface = VK_NULL_HANDLE;
18038
18039 VkResult err;
18040 bool pass;
18041 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18042 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18043 // uint32_t swapchain_image_count = 0;
18044 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18045 // uint32_t image_index = 0;
18046 // VkPresentInfoKHR present_info = {};
18047
Tony Barbour1fa09702017-03-16 12:09:08 -060018048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018049
18050 // Use the create function from one of the VK_KHR_*_surface extension in
18051 // order to create a surface, testing all known errors in the process,
18052 // before successfully creating a surface:
18053 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18055 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18056 pass = (err != VK_SUCCESS);
18057 ASSERT_TRUE(pass);
18058 m_errorMonitor->VerifyFound();
18059
18060 // Next, try to create a surface with the wrong
18061 // VkXcbSurfaceCreateInfoKHR::sType:
18062 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18063 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18065 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18066 pass = (err != VK_SUCCESS);
18067 ASSERT_TRUE(pass);
18068 m_errorMonitor->VerifyFound();
18069
18070 // Create a native window, and then correctly create a surface:
18071 xcb_connection_t *connection;
18072 xcb_screen_t *screen;
18073 xcb_window_t xcb_window;
18074 xcb_intern_atom_reply_t *atom_wm_delete_window;
18075
18076 const xcb_setup_t *setup;
18077 xcb_screen_iterator_t iter;
18078 int scr;
18079 uint32_t value_mask, value_list[32];
18080 int width = 1;
18081 int height = 1;
18082
18083 connection = xcb_connect(NULL, &scr);
18084 ASSERT_TRUE(connection != NULL);
18085 setup = xcb_get_setup(connection);
18086 iter = xcb_setup_roots_iterator(setup);
18087 while (scr-- > 0)
18088 xcb_screen_next(&iter);
18089 screen = iter.data;
18090
18091 xcb_window = xcb_generate_id(connection);
18092
18093 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18094 value_list[0] = screen->black_pixel;
18095 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18096
18097 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18098 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18099
18100 /* Magic code that will send notification when window is destroyed */
18101 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18102 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18103
18104 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18105 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18106 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18107 free(reply);
18108
18109 xcb_map_window(connection, xcb_window);
18110
18111 // Force the x/y coordinates to 100,100 results are identical in consecutive
18112 // runs
18113 const uint32_t coords[] = { 100, 100 };
18114 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18115
18116 // Finally, try to correctly create a surface:
18117 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18118 xcb_create_info.pNext = NULL;
18119 xcb_create_info.flags = 0;
18120 xcb_create_info.connection = connection;
18121 xcb_create_info.window = xcb_window;
18122 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18123 pass = (err == VK_SUCCESS);
18124 ASSERT_TRUE(pass);
18125
18126 // Check if surface supports presentation:
18127
18128 // 1st, do so without having queried the queue families:
18129 VkBool32 supported = false;
18130 // TODO: Get the following error to come out:
18131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18132 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18133 "function");
18134 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18135 pass = (err != VK_SUCCESS);
18136 // ASSERT_TRUE(pass);
18137 // m_errorMonitor->VerifyFound();
18138
18139 // Next, query a queue family index that's too large:
18140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18141 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18142 pass = (err != VK_SUCCESS);
18143 ASSERT_TRUE(pass);
18144 m_errorMonitor->VerifyFound();
18145
18146 // Finally, do so correctly:
18147 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18148 // SUPPORTED
18149 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18150 pass = (err == VK_SUCCESS);
18151 ASSERT_TRUE(pass);
18152
18153 // Before proceeding, try to create a swapchain without having called
18154 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18155 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18156 swapchain_create_info.pNext = NULL;
18157 swapchain_create_info.flags = 0;
18158 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18159 swapchain_create_info.surface = surface;
18160 swapchain_create_info.imageArrayLayers = 1;
18161 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18162 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18164 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18165 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18166 pass = (err != VK_SUCCESS);
18167 ASSERT_TRUE(pass);
18168 m_errorMonitor->VerifyFound();
18169
18170 // Get the surface capabilities:
18171 VkSurfaceCapabilitiesKHR surface_capabilities;
18172
18173 // Do so correctly (only error logged by this entrypoint is if the
18174 // extension isn't enabled):
18175 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18176 pass = (err == VK_SUCCESS);
18177 ASSERT_TRUE(pass);
18178
18179 // Get the surface formats:
18180 uint32_t surface_format_count;
18181
18182 // First, try without a pointer to surface_format_count:
18183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18184 "specified as NULL");
18185 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18186 pass = (err == VK_SUCCESS);
18187 ASSERT_TRUE(pass);
18188 m_errorMonitor->VerifyFound();
18189
18190 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18191 // correctly done a 1st try (to get the count):
18192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18193 surface_format_count = 0;
18194 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18195 pass = (err == VK_SUCCESS);
18196 ASSERT_TRUE(pass);
18197 m_errorMonitor->VerifyFound();
18198
18199 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18200 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18201 pass = (err == VK_SUCCESS);
18202 ASSERT_TRUE(pass);
18203
18204 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18205 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18206
18207 // Next, do a 2nd try with surface_format_count being set too high:
18208 surface_format_count += 5;
18209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18210 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18211 pass = (err == VK_SUCCESS);
18212 ASSERT_TRUE(pass);
18213 m_errorMonitor->VerifyFound();
18214
18215 // Finally, do a correct 1st and 2nd try:
18216 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18217 pass = (err == VK_SUCCESS);
18218 ASSERT_TRUE(pass);
18219 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18220 pass = (err == VK_SUCCESS);
18221 ASSERT_TRUE(pass);
18222
18223 // Get the surface present modes:
18224 uint32_t surface_present_mode_count;
18225
18226 // First, try without a pointer to surface_format_count:
18227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18228 "specified as NULL");
18229
18230 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18231 pass = (err == VK_SUCCESS);
18232 ASSERT_TRUE(pass);
18233 m_errorMonitor->VerifyFound();
18234
18235 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18236 // correctly done a 1st try (to get the count):
18237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18238 surface_present_mode_count = 0;
18239 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18240 (VkPresentModeKHR *)&surface_present_mode_count);
18241 pass = (err == VK_SUCCESS);
18242 ASSERT_TRUE(pass);
18243 m_errorMonitor->VerifyFound();
18244
18245 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18246 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18247 pass = (err == VK_SUCCESS);
18248 ASSERT_TRUE(pass);
18249
18250 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18251 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18252
18253 // Next, do a 2nd try with surface_format_count being set too high:
18254 surface_present_mode_count += 5;
18255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18256 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18257 pass = (err == VK_SUCCESS);
18258 ASSERT_TRUE(pass);
18259 m_errorMonitor->VerifyFound();
18260
18261 // Finally, do a correct 1st and 2nd try:
18262 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18263 pass = (err == VK_SUCCESS);
18264 ASSERT_TRUE(pass);
18265 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18266 pass = (err == VK_SUCCESS);
18267 ASSERT_TRUE(pass);
18268
18269 // Create a swapchain:
18270
18271 // First, try without a pointer to swapchain_create_info:
18272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18273 "specified as NULL");
18274
18275 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18276 pass = (err != VK_SUCCESS);
18277 ASSERT_TRUE(pass);
18278 m_errorMonitor->VerifyFound();
18279
18280 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18281 // sType:
18282 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18284
18285 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18286 pass = (err != VK_SUCCESS);
18287 ASSERT_TRUE(pass);
18288 m_errorMonitor->VerifyFound();
18289
18290 // Next, call with a NULL swapchain pointer:
18291 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18292 swapchain_create_info.pNext = NULL;
18293 swapchain_create_info.flags = 0;
18294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18295 "specified as NULL");
18296
18297 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18298 pass = (err != VK_SUCCESS);
18299 ASSERT_TRUE(pass);
18300 m_errorMonitor->VerifyFound();
18301
18302 // TODO: Enhance swapchain layer so that
18303 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18304
18305 // Next, call with a queue family index that's too large:
18306 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18307 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18308 swapchain_create_info.queueFamilyIndexCount = 2;
18309 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18311 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18312 pass = (err != VK_SUCCESS);
18313 ASSERT_TRUE(pass);
18314 m_errorMonitor->VerifyFound();
18315
18316 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18317 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18318 swapchain_create_info.queueFamilyIndexCount = 1;
18319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18320 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18321 "pCreateInfo->pQueueFamilyIndices).");
18322 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18323 pass = (err != VK_SUCCESS);
18324 ASSERT_TRUE(pass);
18325 m_errorMonitor->VerifyFound();
18326
18327 // Next, call with an invalid imageSharingMode:
18328 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18329 swapchain_create_info.queueFamilyIndexCount = 1;
18330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18331 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18332 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18333 pass = (err != VK_SUCCESS);
18334 ASSERT_TRUE(pass);
18335 m_errorMonitor->VerifyFound();
18336 // Fix for the future:
18337 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18338 // SUPPORTED
18339 swapchain_create_info.queueFamilyIndexCount = 0;
18340 queueFamilyIndex[0] = 0;
18341 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18342
18343 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18344 // Get the images from a swapchain:
18345 // Acquire an image from a swapchain:
18346 // Present an image to a swapchain:
18347 // Destroy the swapchain:
18348
18349 // TODOs:
18350 //
18351 // - Try destroying the device without first destroying the swapchain
18352 //
18353 // - Try destroying the device without first destroying the surface
18354 //
18355 // - Try destroying the surface without first destroying the swapchain
18356
18357 // Destroy the surface:
18358 vkDestroySurfaceKHR(instance(), surface, NULL);
18359
18360 // Tear down the window:
18361 xcb_destroy_window(connection, xcb_window);
18362 xcb_disconnect(connection);
18363
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018364#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018365 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018366#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018367}
Chris Forbes09368e42016-10-13 11:59:22 +130018368#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018369
18370//
18371// POSITIVE VALIDATION TESTS
18372//
18373// These tests do not expect to encounter ANY validation errors pass only if this is true
18374
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018375TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18376 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018377 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18379
18380 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18381 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018382 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018383 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18384 command_buffer_allocate_info.commandBufferCount = 1;
18385
18386 VkCommandBuffer secondary_command_buffer;
18387 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18388 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18389 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18390 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18391 command_buffer_inheritance_info.renderPass = m_renderPass;
18392 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18393
18394 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18395 command_buffer_begin_info.flags =
18396 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18397 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18398
18399 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18400 VkClearAttachment color_attachment;
18401 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18402 color_attachment.clearValue.color.float32[0] = 0;
18403 color_attachment.clearValue.color.float32[1] = 0;
18404 color_attachment.clearValue.color.float32[2] = 0;
18405 color_attachment.clearValue.color.float32[3] = 0;
18406 color_attachment.colorAttachment = 0;
18407 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18408 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18409}
18410
Tobin Ehlise0006882016-11-03 10:14:28 -060018411TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018412 TEST_DESCRIPTION(
18413 "Perform an image layout transition in a secondary command buffer followed "
18414 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018415 VkResult err;
18416 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018417 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018418 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018419 if (!depth_format) {
18420 return;
18421 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18423 // Allocate a secondary and primary cmd buffer
18424 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18425 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018426 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018427 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18428 command_buffer_allocate_info.commandBufferCount = 1;
18429
18430 VkCommandBuffer secondary_command_buffer;
18431 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18432 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18433 VkCommandBuffer primary_command_buffer;
18434 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18435 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18436 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18437 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18438 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18439 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18440 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18441
18442 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18443 ASSERT_VK_SUCCESS(err);
18444 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018445 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 -060018446 ASSERT_TRUE(image.initialized());
18447 VkImageMemoryBarrier img_barrier = {};
18448 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18449 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18450 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18451 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18452 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18453 img_barrier.image = image.handle();
18454 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18455 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18456 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18457 img_barrier.subresourceRange.baseArrayLayer = 0;
18458 img_barrier.subresourceRange.baseMipLevel = 0;
18459 img_barrier.subresourceRange.layerCount = 1;
18460 img_barrier.subresourceRange.levelCount = 1;
18461 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18462 0, nullptr, 1, &img_barrier);
18463 err = vkEndCommandBuffer(secondary_command_buffer);
18464 ASSERT_VK_SUCCESS(err);
18465
18466 // Now update primary cmd buffer to execute secondary and transitions image
18467 command_buffer_begin_info.pInheritanceInfo = nullptr;
18468 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18469 ASSERT_VK_SUCCESS(err);
18470 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18471 VkImageMemoryBarrier img_barrier2 = {};
18472 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18473 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18474 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18475 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18476 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18477 img_barrier2.image = image.handle();
18478 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18479 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18480 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18481 img_barrier2.subresourceRange.baseArrayLayer = 0;
18482 img_barrier2.subresourceRange.baseMipLevel = 0;
18483 img_barrier2.subresourceRange.layerCount = 1;
18484 img_barrier2.subresourceRange.levelCount = 1;
18485 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18486 nullptr, 1, &img_barrier2);
18487 err = vkEndCommandBuffer(primary_command_buffer);
18488 ASSERT_VK_SUCCESS(err);
18489 VkSubmitInfo submit_info = {};
18490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18491 submit_info.commandBufferCount = 1;
18492 submit_info.pCommandBuffers = &primary_command_buffer;
18493 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18494 ASSERT_VK_SUCCESS(err);
18495 m_errorMonitor->VerifyNotFound();
18496 err = vkDeviceWaitIdle(m_device->device());
18497 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018498 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18499 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018500}
18501
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018502// This is a positive test. No failures are expected.
18503TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018504 TEST_DESCRIPTION(
18505 "Ensure that the vkUpdateDescriptorSets validation code "
18506 "is ignoring VkWriteDescriptorSet members that are not "
18507 "related to the descriptor type specified by "
18508 "VkWriteDescriptorSet::descriptorType. Correct "
18509 "validation behavior will result in the test running to "
18510 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018511
18512 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18513
Tony Barbour1fa09702017-03-16 12:09:08 -060018514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018515
18516 // Image Case
18517 {
18518 m_errorMonitor->ExpectSuccess();
18519
18520 VkImage image;
18521 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18522 const int32_t tex_width = 32;
18523 const int32_t tex_height = 32;
18524 VkImageCreateInfo image_create_info = {};
18525 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18526 image_create_info.pNext = NULL;
18527 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18528 image_create_info.format = tex_format;
18529 image_create_info.extent.width = tex_width;
18530 image_create_info.extent.height = tex_height;
18531 image_create_info.extent.depth = 1;
18532 image_create_info.mipLevels = 1;
18533 image_create_info.arrayLayers = 1;
18534 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18535 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18536 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18537 image_create_info.flags = 0;
18538 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18539 ASSERT_VK_SUCCESS(err);
18540
18541 VkMemoryRequirements memory_reqs;
18542 VkDeviceMemory image_memory;
18543 bool pass;
18544 VkMemoryAllocateInfo memory_info = {};
18545 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18546 memory_info.pNext = NULL;
18547 memory_info.allocationSize = 0;
18548 memory_info.memoryTypeIndex = 0;
18549 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18550 memory_info.allocationSize = memory_reqs.size;
18551 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18552 ASSERT_TRUE(pass);
18553 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18554 ASSERT_VK_SUCCESS(err);
18555 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18556 ASSERT_VK_SUCCESS(err);
18557
18558 VkImageViewCreateInfo image_view_create_info = {};
18559 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18560 image_view_create_info.image = image;
18561 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18562 image_view_create_info.format = tex_format;
18563 image_view_create_info.subresourceRange.layerCount = 1;
18564 image_view_create_info.subresourceRange.baseMipLevel = 0;
18565 image_view_create_info.subresourceRange.levelCount = 1;
18566 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18567
18568 VkImageView view;
18569 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18570 ASSERT_VK_SUCCESS(err);
18571
18572 VkDescriptorPoolSize ds_type_count = {};
18573 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18574 ds_type_count.descriptorCount = 1;
18575
18576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18578 ds_pool_ci.pNext = NULL;
18579 ds_pool_ci.maxSets = 1;
18580 ds_pool_ci.poolSizeCount = 1;
18581 ds_pool_ci.pPoolSizes = &ds_type_count;
18582
18583 VkDescriptorPool ds_pool;
18584 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18585 ASSERT_VK_SUCCESS(err);
18586
18587 VkDescriptorSetLayoutBinding dsl_binding = {};
18588 dsl_binding.binding = 0;
18589 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18590 dsl_binding.descriptorCount = 1;
18591 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18592 dsl_binding.pImmutableSamplers = NULL;
18593
18594 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18595 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18596 ds_layout_ci.pNext = NULL;
18597 ds_layout_ci.bindingCount = 1;
18598 ds_layout_ci.pBindings = &dsl_binding;
18599 VkDescriptorSetLayout ds_layout;
18600 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18601 ASSERT_VK_SUCCESS(err);
18602
18603 VkDescriptorSet descriptor_set;
18604 VkDescriptorSetAllocateInfo alloc_info = {};
18605 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18606 alloc_info.descriptorSetCount = 1;
18607 alloc_info.descriptorPool = ds_pool;
18608 alloc_info.pSetLayouts = &ds_layout;
18609 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18610 ASSERT_VK_SUCCESS(err);
18611
18612 VkDescriptorImageInfo image_info = {};
18613 image_info.imageView = view;
18614 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18615
18616 VkWriteDescriptorSet descriptor_write;
18617 memset(&descriptor_write, 0, sizeof(descriptor_write));
18618 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18619 descriptor_write.dstSet = descriptor_set;
18620 descriptor_write.dstBinding = 0;
18621 descriptor_write.descriptorCount = 1;
18622 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18623 descriptor_write.pImageInfo = &image_info;
18624
18625 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18626 // be
18627 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18628 // This will most likely produce a crash if the parameter_validation
18629 // layer
18630 // does not correctly ignore pBufferInfo.
18631 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18632 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18633
18634 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18635
18636 m_errorMonitor->VerifyNotFound();
18637
18638 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18639 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18640 vkDestroyImageView(m_device->device(), view, NULL);
18641 vkDestroyImage(m_device->device(), image, NULL);
18642 vkFreeMemory(m_device->device(), image_memory, NULL);
18643 }
18644
18645 // Buffer Case
18646 {
18647 m_errorMonitor->ExpectSuccess();
18648
18649 VkBuffer buffer;
18650 uint32_t queue_family_index = 0;
18651 VkBufferCreateInfo buffer_create_info = {};
18652 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18653 buffer_create_info.size = 1024;
18654 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18655 buffer_create_info.queueFamilyIndexCount = 1;
18656 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18657
18658 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18659 ASSERT_VK_SUCCESS(err);
18660
18661 VkMemoryRequirements memory_reqs;
18662 VkDeviceMemory buffer_memory;
18663 bool pass;
18664 VkMemoryAllocateInfo memory_info = {};
18665 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18666 memory_info.pNext = NULL;
18667 memory_info.allocationSize = 0;
18668 memory_info.memoryTypeIndex = 0;
18669
18670 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18671 memory_info.allocationSize = memory_reqs.size;
18672 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18673 ASSERT_TRUE(pass);
18674
18675 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18676 ASSERT_VK_SUCCESS(err);
18677 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18678 ASSERT_VK_SUCCESS(err);
18679
18680 VkDescriptorPoolSize ds_type_count = {};
18681 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18682 ds_type_count.descriptorCount = 1;
18683
18684 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18685 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18686 ds_pool_ci.pNext = NULL;
18687 ds_pool_ci.maxSets = 1;
18688 ds_pool_ci.poolSizeCount = 1;
18689 ds_pool_ci.pPoolSizes = &ds_type_count;
18690
18691 VkDescriptorPool ds_pool;
18692 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18693 ASSERT_VK_SUCCESS(err);
18694
18695 VkDescriptorSetLayoutBinding dsl_binding = {};
18696 dsl_binding.binding = 0;
18697 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18698 dsl_binding.descriptorCount = 1;
18699 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18700 dsl_binding.pImmutableSamplers = NULL;
18701
18702 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18703 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18704 ds_layout_ci.pNext = NULL;
18705 ds_layout_ci.bindingCount = 1;
18706 ds_layout_ci.pBindings = &dsl_binding;
18707 VkDescriptorSetLayout ds_layout;
18708 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18709 ASSERT_VK_SUCCESS(err);
18710
18711 VkDescriptorSet descriptor_set;
18712 VkDescriptorSetAllocateInfo alloc_info = {};
18713 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18714 alloc_info.descriptorSetCount = 1;
18715 alloc_info.descriptorPool = ds_pool;
18716 alloc_info.pSetLayouts = &ds_layout;
18717 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18718 ASSERT_VK_SUCCESS(err);
18719
18720 VkDescriptorBufferInfo buffer_info = {};
18721 buffer_info.buffer = buffer;
18722 buffer_info.offset = 0;
18723 buffer_info.range = 1024;
18724
18725 VkWriteDescriptorSet descriptor_write;
18726 memset(&descriptor_write, 0, sizeof(descriptor_write));
18727 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18728 descriptor_write.dstSet = descriptor_set;
18729 descriptor_write.dstBinding = 0;
18730 descriptor_write.descriptorCount = 1;
18731 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18732 descriptor_write.pBufferInfo = &buffer_info;
18733
18734 // Set pImageInfo and pTexelBufferView to invalid values, which should
18735 // be
18736 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18737 // This will most likely produce a crash if the parameter_validation
18738 // layer
18739 // does not correctly ignore pImageInfo.
18740 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18741 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18742
18743 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18744
18745 m_errorMonitor->VerifyNotFound();
18746
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018747 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18748 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18749 vkDestroyBuffer(m_device->device(), buffer, NULL);
18750 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18751 }
18752
18753 // Texel Buffer Case
18754 {
18755 m_errorMonitor->ExpectSuccess();
18756
18757 VkBuffer buffer;
18758 uint32_t queue_family_index = 0;
18759 VkBufferCreateInfo buffer_create_info = {};
18760 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18761 buffer_create_info.size = 1024;
18762 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18763 buffer_create_info.queueFamilyIndexCount = 1;
18764 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18765
18766 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18767 ASSERT_VK_SUCCESS(err);
18768
18769 VkMemoryRequirements memory_reqs;
18770 VkDeviceMemory buffer_memory;
18771 bool pass;
18772 VkMemoryAllocateInfo memory_info = {};
18773 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18774 memory_info.pNext = NULL;
18775 memory_info.allocationSize = 0;
18776 memory_info.memoryTypeIndex = 0;
18777
18778 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18779 memory_info.allocationSize = memory_reqs.size;
18780 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18781 ASSERT_TRUE(pass);
18782
18783 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18784 ASSERT_VK_SUCCESS(err);
18785 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18786 ASSERT_VK_SUCCESS(err);
18787
18788 VkBufferViewCreateInfo buff_view_ci = {};
18789 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18790 buff_view_ci.buffer = buffer;
18791 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18792 buff_view_ci.range = VK_WHOLE_SIZE;
18793 VkBufferView buffer_view;
18794 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18795
18796 VkDescriptorPoolSize ds_type_count = {};
18797 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18798 ds_type_count.descriptorCount = 1;
18799
18800 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18801 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18802 ds_pool_ci.pNext = NULL;
18803 ds_pool_ci.maxSets = 1;
18804 ds_pool_ci.poolSizeCount = 1;
18805 ds_pool_ci.pPoolSizes = &ds_type_count;
18806
18807 VkDescriptorPool ds_pool;
18808 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18809 ASSERT_VK_SUCCESS(err);
18810
18811 VkDescriptorSetLayoutBinding dsl_binding = {};
18812 dsl_binding.binding = 0;
18813 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18814 dsl_binding.descriptorCount = 1;
18815 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18816 dsl_binding.pImmutableSamplers = NULL;
18817
18818 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18819 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18820 ds_layout_ci.pNext = NULL;
18821 ds_layout_ci.bindingCount = 1;
18822 ds_layout_ci.pBindings = &dsl_binding;
18823 VkDescriptorSetLayout ds_layout;
18824 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18825 ASSERT_VK_SUCCESS(err);
18826
18827 VkDescriptorSet descriptor_set;
18828 VkDescriptorSetAllocateInfo alloc_info = {};
18829 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18830 alloc_info.descriptorSetCount = 1;
18831 alloc_info.descriptorPool = ds_pool;
18832 alloc_info.pSetLayouts = &ds_layout;
18833 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18834 ASSERT_VK_SUCCESS(err);
18835
18836 VkWriteDescriptorSet descriptor_write;
18837 memset(&descriptor_write, 0, sizeof(descriptor_write));
18838 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18839 descriptor_write.dstSet = descriptor_set;
18840 descriptor_write.dstBinding = 0;
18841 descriptor_write.descriptorCount = 1;
18842 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18843 descriptor_write.pTexelBufferView = &buffer_view;
18844
18845 // Set pImageInfo and pBufferInfo to invalid values, which should be
18846 // ignored for descriptorType ==
18847 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18848 // This will most likely produce a crash if the parameter_validation
18849 // layer
18850 // does not correctly ignore pImageInfo and pBufferInfo.
18851 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18852 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18853
18854 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18855
18856 m_errorMonitor->VerifyNotFound();
18857
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018858 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18859 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18860 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18861 vkDestroyBuffer(m_device->device(), buffer, NULL);
18862 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18863 }
18864}
18865
Tobin Ehlisf7428442016-10-25 07:58:24 -060018866TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18867 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18868
Tony Barbour1fa09702017-03-16 12:09:08 -060018869 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018870 // Create layout where two binding #s are "1"
18871 static const uint32_t NUM_BINDINGS = 3;
18872 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18873 dsl_binding[0].binding = 1;
18874 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18875 dsl_binding[0].descriptorCount = 1;
18876 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18877 dsl_binding[0].pImmutableSamplers = NULL;
18878 dsl_binding[1].binding = 0;
18879 dsl_binding[1].descriptorCount = 1;
18880 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18881 dsl_binding[1].descriptorCount = 1;
18882 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18883 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018884 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018885 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18886 dsl_binding[2].descriptorCount = 1;
18887 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18888 dsl_binding[2].pImmutableSamplers = NULL;
18889
18890 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18891 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18892 ds_layout_ci.pNext = NULL;
18893 ds_layout_ci.bindingCount = NUM_BINDINGS;
18894 ds_layout_ci.pBindings = dsl_binding;
18895 VkDescriptorSetLayout ds_layout;
18896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18897 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18898 m_errorMonitor->VerifyFound();
18899}
18900
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018901TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018902 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18903
Tony Barbour1fa09702017-03-16 12:09:08 -060018904 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018905
Tony Barbour552f6c02016-12-21 14:34:07 -070018906 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018907
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018908 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18909
18910 {
18911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18912 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18913 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18914 m_errorMonitor->VerifyFound();
18915 }
18916
18917 {
18918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18919 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18921 m_errorMonitor->VerifyFound();
18922 }
18923
18924 {
18925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18926 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18927 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18928 m_errorMonitor->VerifyFound();
18929 }
18930
18931 {
18932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18933 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18934 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18935 m_errorMonitor->VerifyFound();
18936 }
18937
18938 {
18939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18940 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18941 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18942 m_errorMonitor->VerifyFound();
18943 }
18944
18945 {
18946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18947 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18948 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18949 m_errorMonitor->VerifyFound();
18950 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018951
18952 {
18953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18954 VkRect2D scissor = {{-1, 0}, {16, 16}};
18955 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18956 m_errorMonitor->VerifyFound();
18957 }
18958
18959 {
18960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18961 VkRect2D scissor = {{0, -2}, {16, 16}};
18962 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18963 m_errorMonitor->VerifyFound();
18964 }
18965
18966 {
18967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18968 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18969 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18970 m_errorMonitor->VerifyFound();
18971 }
18972
18973 {
18974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18975 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18976 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18977 m_errorMonitor->VerifyFound();
18978 }
18979
Tony Barbour552f6c02016-12-21 14:34:07 -070018980 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018981}
18982
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018983// This is a positive test. No failures are expected.
18984TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18985 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18986 VkResult err;
18987
Tony Barbour1fa09702017-03-16 12:09:08 -060018988 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018989 m_errorMonitor->ExpectSuccess();
18990 VkDescriptorPoolSize ds_type_count = {};
18991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18992 ds_type_count.descriptorCount = 2;
18993
18994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18996 ds_pool_ci.pNext = NULL;
18997 ds_pool_ci.maxSets = 1;
18998 ds_pool_ci.poolSizeCount = 1;
18999 ds_pool_ci.pPoolSizes = &ds_type_count;
19000
19001 VkDescriptorPool ds_pool;
19002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19003 ASSERT_VK_SUCCESS(err);
19004
19005 // Create layout with two uniform buffer descriptors w/ empty binding between them
19006 static const uint32_t NUM_BINDINGS = 3;
19007 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19008 dsl_binding[0].binding = 0;
19009 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19010 dsl_binding[0].descriptorCount = 1;
19011 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19012 dsl_binding[0].pImmutableSamplers = NULL;
19013 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019014 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019015 dsl_binding[2].binding = 2;
19016 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19017 dsl_binding[2].descriptorCount = 1;
19018 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19019 dsl_binding[2].pImmutableSamplers = NULL;
19020
19021 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19022 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19023 ds_layout_ci.pNext = NULL;
19024 ds_layout_ci.bindingCount = NUM_BINDINGS;
19025 ds_layout_ci.pBindings = dsl_binding;
19026 VkDescriptorSetLayout ds_layout;
19027 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19028 ASSERT_VK_SUCCESS(err);
19029
19030 VkDescriptorSet descriptor_set = {};
19031 VkDescriptorSetAllocateInfo alloc_info = {};
19032 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19033 alloc_info.descriptorSetCount = 1;
19034 alloc_info.descriptorPool = ds_pool;
19035 alloc_info.pSetLayouts = &ds_layout;
19036 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19037 ASSERT_VK_SUCCESS(err);
19038
19039 // Create a buffer to be used for update
19040 VkBufferCreateInfo buff_ci = {};
19041 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19042 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19043 buff_ci.size = 256;
19044 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19045 VkBuffer buffer;
19046 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19047 ASSERT_VK_SUCCESS(err);
19048 // Have to bind memory to buffer before descriptor update
19049 VkMemoryAllocateInfo mem_alloc = {};
19050 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19051 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019052 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019053 mem_alloc.memoryTypeIndex = 0;
19054
19055 VkMemoryRequirements mem_reqs;
19056 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19057 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19058 if (!pass) {
19059 vkDestroyBuffer(m_device->device(), buffer, NULL);
19060 return;
19061 }
19062
19063 VkDeviceMemory mem;
19064 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19065 ASSERT_VK_SUCCESS(err);
19066 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19067 ASSERT_VK_SUCCESS(err);
19068
19069 // Only update the descriptor at binding 2
19070 VkDescriptorBufferInfo buff_info = {};
19071 buff_info.buffer = buffer;
19072 buff_info.offset = 0;
19073 buff_info.range = VK_WHOLE_SIZE;
19074 VkWriteDescriptorSet descriptor_write = {};
19075 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19076 descriptor_write.dstBinding = 2;
19077 descriptor_write.descriptorCount = 1;
19078 descriptor_write.pTexelBufferView = nullptr;
19079 descriptor_write.pBufferInfo = &buff_info;
19080 descriptor_write.pImageInfo = nullptr;
19081 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19082 descriptor_write.dstSet = descriptor_set;
19083
19084 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19085
19086 m_errorMonitor->VerifyNotFound();
19087 // Cleanup
19088 vkFreeMemory(m_device->device(), mem, NULL);
19089 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19090 vkDestroyBuffer(m_device->device(), buffer, NULL);
19091 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19092}
19093
19094// This is a positive test. No failures are expected.
19095TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19096 VkResult err;
19097 bool pass;
19098
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019099 TEST_DESCRIPTION(
19100 "Create a buffer, allocate memory, bind memory, destroy "
19101 "the buffer, create an image, and bind the same memory to "
19102 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019103
19104 m_errorMonitor->ExpectSuccess();
19105
Tony Barbour1fa09702017-03-16 12:09:08 -060019106 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019107
19108 VkBuffer buffer;
19109 VkImage image;
19110 VkDeviceMemory mem;
19111 VkMemoryRequirements mem_reqs;
19112
19113 VkBufferCreateInfo buf_info = {};
19114 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19115 buf_info.pNext = NULL;
19116 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19117 buf_info.size = 256;
19118 buf_info.queueFamilyIndexCount = 0;
19119 buf_info.pQueueFamilyIndices = NULL;
19120 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19121 buf_info.flags = 0;
19122 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19123 ASSERT_VK_SUCCESS(err);
19124
19125 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19126
19127 VkMemoryAllocateInfo alloc_info = {};
19128 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19129 alloc_info.pNext = NULL;
19130 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019131
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019132 // Ensure memory is big enough for both bindings
19133 alloc_info.allocationSize = 0x10000;
19134
19135 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19136 if (!pass) {
19137 vkDestroyBuffer(m_device->device(), buffer, NULL);
19138 return;
19139 }
19140
19141 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19142 ASSERT_VK_SUCCESS(err);
19143
19144 uint8_t *pData;
19145 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19146 ASSERT_VK_SUCCESS(err);
19147
19148 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19149
19150 vkUnmapMemory(m_device->device(), mem);
19151
19152 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19153 ASSERT_VK_SUCCESS(err);
19154
19155 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19156 // memory. In fact, it was never used by the GPU.
19157 // Just be be sure, wait for idle.
19158 vkDestroyBuffer(m_device->device(), buffer, NULL);
19159 vkDeviceWaitIdle(m_device->device());
19160
Tobin Ehlis6a005702016-12-28 15:25:56 -070019161 // Use optimal as some platforms report linear support but then fail image creation
19162 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19163 VkImageFormatProperties image_format_properties;
19164 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19165 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19166 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019167 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019168 vkFreeMemory(m_device->device(), mem, NULL);
19169 return;
19170 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019171 VkImageCreateInfo image_create_info = {};
19172 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19173 image_create_info.pNext = NULL;
19174 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19175 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19176 image_create_info.extent.width = 64;
19177 image_create_info.extent.height = 64;
19178 image_create_info.extent.depth = 1;
19179 image_create_info.mipLevels = 1;
19180 image_create_info.arrayLayers = 1;
19181 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019182 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019183 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19184 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19185 image_create_info.queueFamilyIndexCount = 0;
19186 image_create_info.pQueueFamilyIndices = NULL;
19187 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19188 image_create_info.flags = 0;
19189
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019190 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019191 * to be textures or it will be the staging image if they are not.
19192 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019193 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19194 ASSERT_VK_SUCCESS(err);
19195
19196 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19197
Tobin Ehlis6a005702016-12-28 15:25:56 -070019198 VkMemoryAllocateInfo mem_alloc = {};
19199 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19200 mem_alloc.pNext = NULL;
19201 mem_alloc.allocationSize = 0;
19202 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019203 mem_alloc.allocationSize = mem_reqs.size;
19204
19205 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19206 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019207 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019208 vkDestroyImage(m_device->device(), image, NULL);
19209 return;
19210 }
19211
19212 // VALIDATION FAILURE:
19213 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19214 ASSERT_VK_SUCCESS(err);
19215
19216 m_errorMonitor->VerifyNotFound();
19217
19218 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019219 vkDestroyImage(m_device->device(), image, NULL);
19220}
19221
Tony Barbourab713912017-02-02 14:17:35 -070019222// This is a positive test. No failures are expected.
19223TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19224 VkResult err;
19225
19226 TEST_DESCRIPTION(
19227 "Call all applicable destroy and free routines with NULL"
19228 "handles, expecting no validation errors");
19229
19230 m_errorMonitor->ExpectSuccess();
19231
Tony Barbour1fa09702017-03-16 12:09:08 -060019232 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019233 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19234 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19235 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19236 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19237 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19238 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19239 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19240 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19241 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19242 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19243 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19244 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19245 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19246 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19247 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19248 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19249 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19250 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19251 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19252 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19253
19254 VkCommandPool command_pool;
19255 VkCommandPoolCreateInfo pool_create_info{};
19256 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19257 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19258 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19259 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19260 VkCommandBuffer command_buffers[3] = {};
19261 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19262 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19263 command_buffer_allocate_info.commandPool = command_pool;
19264 command_buffer_allocate_info.commandBufferCount = 1;
19265 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19266 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19267 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19268 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19269
19270 VkDescriptorPoolSize ds_type_count = {};
19271 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19272 ds_type_count.descriptorCount = 1;
19273
19274 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19275 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19276 ds_pool_ci.pNext = NULL;
19277 ds_pool_ci.maxSets = 1;
19278 ds_pool_ci.poolSizeCount = 1;
19279 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19280 ds_pool_ci.pPoolSizes = &ds_type_count;
19281
19282 VkDescriptorPool ds_pool;
19283 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19284 ASSERT_VK_SUCCESS(err);
19285
19286 VkDescriptorSetLayoutBinding dsl_binding = {};
19287 dsl_binding.binding = 2;
19288 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19289 dsl_binding.descriptorCount = 1;
19290 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19291 dsl_binding.pImmutableSamplers = NULL;
19292 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19293 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19294 ds_layout_ci.pNext = NULL;
19295 ds_layout_ci.bindingCount = 1;
19296 ds_layout_ci.pBindings = &dsl_binding;
19297 VkDescriptorSetLayout ds_layout;
19298 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19299 ASSERT_VK_SUCCESS(err);
19300
19301 VkDescriptorSet descriptor_sets[3] = {};
19302 VkDescriptorSetAllocateInfo alloc_info = {};
19303 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19304 alloc_info.descriptorSetCount = 1;
19305 alloc_info.descriptorPool = ds_pool;
19306 alloc_info.pSetLayouts = &ds_layout;
19307 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19308 ASSERT_VK_SUCCESS(err);
19309 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19310 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19311 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19312
19313 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19314
19315 m_errorMonitor->VerifyNotFound();
19316}
19317
Tony Barbour626994c2017-02-08 15:29:37 -070019318TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019319 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019320
19321 m_errorMonitor->ExpectSuccess();
19322
Tony Barbour1fa09702017-03-16 12:09:08 -060019323 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019324 VkCommandBuffer cmd_bufs[4];
19325 VkCommandBufferAllocateInfo alloc_info;
19326 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19327 alloc_info.pNext = NULL;
19328 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019329 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019330 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19331 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19332 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019333 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019334 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19335 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019336 ASSERT_TRUE(image.initialized());
19337 VkCommandBufferBeginInfo cb_binfo;
19338 cb_binfo.pNext = NULL;
19339 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19340 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19341 cb_binfo.flags = 0;
19342 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19343 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19344 VkImageMemoryBarrier img_barrier = {};
19345 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19346 img_barrier.pNext = NULL;
19347 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19348 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19349 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19350 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19351 img_barrier.image = image.handle();
19352 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19353 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19354 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19355 img_barrier.subresourceRange.baseArrayLayer = 0;
19356 img_barrier.subresourceRange.baseMipLevel = 0;
19357 img_barrier.subresourceRange.layerCount = 1;
19358 img_barrier.subresourceRange.levelCount = 1;
19359 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19360 &img_barrier);
19361 vkEndCommandBuffer(cmd_bufs[0]);
19362 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19363 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19364 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19365 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19366 &img_barrier);
19367 vkEndCommandBuffer(cmd_bufs[1]);
19368 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19369 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19370 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19371 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19372 &img_barrier);
19373 vkEndCommandBuffer(cmd_bufs[2]);
19374 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19375 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19376 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19377 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19378 &img_barrier);
19379 vkEndCommandBuffer(cmd_bufs[3]);
19380
19381 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19382 VkSemaphore semaphore1, semaphore2;
19383 VkSemaphoreCreateInfo semaphore_create_info{};
19384 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19385 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19386 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19387 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19388 VkSubmitInfo submit_info[3];
19389 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19390 submit_info[0].pNext = nullptr;
19391 submit_info[0].commandBufferCount = 1;
19392 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19393 submit_info[0].signalSemaphoreCount = 1;
19394 submit_info[0].pSignalSemaphores = &semaphore1;
19395 submit_info[0].waitSemaphoreCount = 0;
19396 submit_info[0].pWaitDstStageMask = nullptr;
19397 submit_info[0].pWaitDstStageMask = flags;
19398 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19399 submit_info[1].pNext = nullptr;
19400 submit_info[1].commandBufferCount = 1;
19401 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19402 submit_info[1].waitSemaphoreCount = 1;
19403 submit_info[1].pWaitSemaphores = &semaphore1;
19404 submit_info[1].signalSemaphoreCount = 1;
19405 submit_info[1].pSignalSemaphores = &semaphore2;
19406 submit_info[1].pWaitDstStageMask = flags;
19407 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19408 submit_info[2].pNext = nullptr;
19409 submit_info[2].commandBufferCount = 2;
19410 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19411 submit_info[2].waitSemaphoreCount = 1;
19412 submit_info[2].pWaitSemaphores = &semaphore2;
19413 submit_info[2].signalSemaphoreCount = 0;
19414 submit_info[2].pSignalSemaphores = nullptr;
19415 submit_info[2].pWaitDstStageMask = flags;
19416 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19417 vkQueueWaitIdle(m_device->m_queue);
19418
19419 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19420 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19421 m_errorMonitor->VerifyNotFound();
19422}
19423
Tobin Ehlis953e8392016-11-17 10:54:13 -070019424TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19425 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19426 // We previously had a bug where dynamic offset of inactive bindings was still being used
19427 VkResult err;
19428 m_errorMonitor->ExpectSuccess();
19429
Tony Barbour1fa09702017-03-16 12:09:08 -060019430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019431 ASSERT_NO_FATAL_FAILURE(InitViewport());
19432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19433
19434 VkDescriptorPoolSize ds_type_count = {};
19435 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19436 ds_type_count.descriptorCount = 3;
19437
19438 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19439 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19440 ds_pool_ci.pNext = NULL;
19441 ds_pool_ci.maxSets = 1;
19442 ds_pool_ci.poolSizeCount = 1;
19443 ds_pool_ci.pPoolSizes = &ds_type_count;
19444
19445 VkDescriptorPool ds_pool;
19446 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19447 ASSERT_VK_SUCCESS(err);
19448
19449 const uint32_t BINDING_COUNT = 3;
19450 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019451 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019452 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19453 dsl_binding[0].descriptorCount = 1;
19454 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19455 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019456 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019457 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19458 dsl_binding[1].descriptorCount = 1;
19459 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19460 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019461 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019462 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19463 dsl_binding[2].descriptorCount = 1;
19464 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19465 dsl_binding[2].pImmutableSamplers = NULL;
19466
19467 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19468 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19469 ds_layout_ci.pNext = NULL;
19470 ds_layout_ci.bindingCount = BINDING_COUNT;
19471 ds_layout_ci.pBindings = dsl_binding;
19472 VkDescriptorSetLayout ds_layout;
19473 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19474 ASSERT_VK_SUCCESS(err);
19475
19476 VkDescriptorSet descriptor_set;
19477 VkDescriptorSetAllocateInfo alloc_info = {};
19478 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19479 alloc_info.descriptorSetCount = 1;
19480 alloc_info.descriptorPool = ds_pool;
19481 alloc_info.pSetLayouts = &ds_layout;
19482 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19483 ASSERT_VK_SUCCESS(err);
19484
19485 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19486 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19487 pipeline_layout_ci.pNext = NULL;
19488 pipeline_layout_ci.setLayoutCount = 1;
19489 pipeline_layout_ci.pSetLayouts = &ds_layout;
19490
19491 VkPipelineLayout pipeline_layout;
19492 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19493 ASSERT_VK_SUCCESS(err);
19494
19495 // Create two buffers to update the descriptors with
19496 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19497 uint32_t qfi = 0;
19498 VkBufferCreateInfo buffCI = {};
19499 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19500 buffCI.size = 2048;
19501 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19502 buffCI.queueFamilyIndexCount = 1;
19503 buffCI.pQueueFamilyIndices = &qfi;
19504
19505 VkBuffer dyub1;
19506 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19507 ASSERT_VK_SUCCESS(err);
19508 // buffer2
19509 buffCI.size = 1024;
19510 VkBuffer dyub2;
19511 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19512 ASSERT_VK_SUCCESS(err);
19513 // Allocate memory and bind to buffers
19514 VkMemoryAllocateInfo mem_alloc[2] = {};
19515 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19516 mem_alloc[0].pNext = NULL;
19517 mem_alloc[0].memoryTypeIndex = 0;
19518 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19519 mem_alloc[1].pNext = NULL;
19520 mem_alloc[1].memoryTypeIndex = 0;
19521
19522 VkMemoryRequirements mem_reqs1;
19523 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19524 VkMemoryRequirements mem_reqs2;
19525 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19526 mem_alloc[0].allocationSize = mem_reqs1.size;
19527 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19528 mem_alloc[1].allocationSize = mem_reqs2.size;
19529 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19530 if (!pass) {
19531 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19532 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19533 return;
19534 }
19535
19536 VkDeviceMemory mem1;
19537 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19538 ASSERT_VK_SUCCESS(err);
19539 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19540 ASSERT_VK_SUCCESS(err);
19541 VkDeviceMemory mem2;
19542 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19543 ASSERT_VK_SUCCESS(err);
19544 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19545 ASSERT_VK_SUCCESS(err);
19546 // Update descriptors
19547 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19548 buff_info[0].buffer = dyub1;
19549 buff_info[0].offset = 0;
19550 buff_info[0].range = 256;
19551 buff_info[1].buffer = dyub1;
19552 buff_info[1].offset = 256;
19553 buff_info[1].range = 512;
19554 buff_info[2].buffer = dyub2;
19555 buff_info[2].offset = 0;
19556 buff_info[2].range = 512;
19557
19558 VkWriteDescriptorSet descriptor_write;
19559 memset(&descriptor_write, 0, sizeof(descriptor_write));
19560 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19561 descriptor_write.dstSet = descriptor_set;
19562 descriptor_write.dstBinding = 0;
19563 descriptor_write.descriptorCount = BINDING_COUNT;
19564 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19565 descriptor_write.pBufferInfo = buff_info;
19566
19567 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19568
Tony Barbour552f6c02016-12-21 14:34:07 -070019569 m_commandBuffer->BeginCommandBuffer();
19570 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019571
19572 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019573 char const *vsSource =
19574 "#version 450\n"
19575 "\n"
19576 "out gl_PerVertex { \n"
19577 " vec4 gl_Position;\n"
19578 "};\n"
19579 "void main(){\n"
19580 " gl_Position = vec4(1);\n"
19581 "}\n";
19582 char const *fsSource =
19583 "#version 450\n"
19584 "\n"
19585 "layout(location=0) out vec4 x;\n"
19586 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19587 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19588 "void main(){\n"
19589 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19590 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019591 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19592 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19593 VkPipelineObj pipe(m_device);
19594 pipe.SetViewport(m_viewports);
19595 pipe.SetScissor(m_scissors);
19596 pipe.AddShader(&vs);
19597 pipe.AddShader(&fs);
19598 pipe.AddColorAttachment();
19599 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19600
19601 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19602 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19603 // we used to have a bug in this case.
19604 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19605 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19606 &descriptor_set, BINDING_COUNT, dyn_off);
19607 Draw(1, 0, 0, 0);
19608 m_errorMonitor->VerifyNotFound();
19609
19610 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19611 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19612 vkFreeMemory(m_device->device(), mem1, NULL);
19613 vkFreeMemory(m_device->device(), mem2, NULL);
19614
19615 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19617 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19618}
19619
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019620TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019621 TEST_DESCRIPTION(
19622 "Ensure that validations handling of non-coherent memory "
19623 "mapping while using VK_WHOLE_SIZE does not cause access "
19624 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019625 VkResult err;
19626 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019627 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019628
19629 VkDeviceMemory mem;
19630 VkMemoryRequirements mem_reqs;
19631 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019632 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019633 VkMemoryAllocateInfo alloc_info = {};
19634 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19635 alloc_info.pNext = NULL;
19636 alloc_info.memoryTypeIndex = 0;
19637
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019638 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019639 alloc_info.allocationSize = allocation_size;
19640
19641 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19642 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 -070019643 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019644 if (!pass) {
19645 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019646 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19647 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019648 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019649 pass = m_device->phy().set_memory_type(
19650 mem_reqs.memoryTypeBits, &alloc_info,
19651 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19652 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019653 if (!pass) {
19654 return;
19655 }
19656 }
19657 }
19658
19659 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19660 ASSERT_VK_SUCCESS(err);
19661
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019662 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019663 m_errorMonitor->ExpectSuccess();
19664 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19665 ASSERT_VK_SUCCESS(err);
19666 VkMappedMemoryRange mmr = {};
19667 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19668 mmr.memory = mem;
19669 mmr.offset = 0;
19670 mmr.size = VK_WHOLE_SIZE;
19671 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19672 ASSERT_VK_SUCCESS(err);
19673 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19674 ASSERT_VK_SUCCESS(err);
19675 m_errorMonitor->VerifyNotFound();
19676 vkUnmapMemory(m_device->device(), mem);
19677
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019678 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019679 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019680 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019681 ASSERT_VK_SUCCESS(err);
19682 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19683 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019684 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019685 mmr.size = VK_WHOLE_SIZE;
19686 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19687 ASSERT_VK_SUCCESS(err);
19688 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19689 ASSERT_VK_SUCCESS(err);
19690 m_errorMonitor->VerifyNotFound();
19691 vkUnmapMemory(m_device->device(), mem);
19692
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019693 // Map with offset and size
19694 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019695 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019696 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019697 ASSERT_VK_SUCCESS(err);
19698 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19699 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019700 mmr.offset = 4 * atom_size;
19701 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019702 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19703 ASSERT_VK_SUCCESS(err);
19704 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19705 ASSERT_VK_SUCCESS(err);
19706 m_errorMonitor->VerifyNotFound();
19707 vkUnmapMemory(m_device->device(), mem);
19708
19709 // Map without offset and flush WHOLE_SIZE with two separate offsets
19710 m_errorMonitor->ExpectSuccess();
19711 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19712 ASSERT_VK_SUCCESS(err);
19713 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19714 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019715 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019716 mmr.size = VK_WHOLE_SIZE;
19717 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19718 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019719 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019720 mmr.size = VK_WHOLE_SIZE;
19721 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19722 ASSERT_VK_SUCCESS(err);
19723 m_errorMonitor->VerifyNotFound();
19724 vkUnmapMemory(m_device->device(), mem);
19725
19726 vkFreeMemory(m_device->device(), mem, NULL);
19727}
19728
19729// This is a positive test. We used to expect error in this case but spec now allows it
19730TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19731 m_errorMonitor->ExpectSuccess();
19732 vk_testing::Fence testFence;
19733 VkFenceCreateInfo fenceInfo = {};
19734 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19735 fenceInfo.pNext = NULL;
19736
Tony Barbour1fa09702017-03-16 12:09:08 -060019737 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019738 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019739 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019740 VkResult result = vkResetFences(m_device->device(), 1, fences);
19741 ASSERT_VK_SUCCESS(result);
19742
19743 m_errorMonitor->VerifyNotFound();
19744}
19745
19746TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19747 m_errorMonitor->ExpectSuccess();
19748
Tony Barbour1fa09702017-03-16 12:09:08 -060019749 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019750 VkResult err;
19751
19752 // Record (empty!) command buffer that can be submitted multiple times
19753 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019754 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19755 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756 m_commandBuffer->BeginCommandBuffer(&cbbi);
19757 m_commandBuffer->EndCommandBuffer();
19758
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019759 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019760 VkFence fence;
19761 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19762 ASSERT_VK_SUCCESS(err);
19763
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019764 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765 VkSemaphore s1, s2;
19766 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19767 ASSERT_VK_SUCCESS(err);
19768 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19769 ASSERT_VK_SUCCESS(err);
19770
19771 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019772 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019773 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19774 ASSERT_VK_SUCCESS(err);
19775
19776 // Submit CB again, signaling s2.
19777 si.pSignalSemaphores = &s2;
19778 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19779 ASSERT_VK_SUCCESS(err);
19780
19781 // Wait for fence.
19782 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19783 ASSERT_VK_SUCCESS(err);
19784
19785 // CB is still in flight from second submission, but semaphore s1 is no
19786 // longer in flight. delete it.
19787 vkDestroySemaphore(m_device->device(), s1, nullptr);
19788
19789 m_errorMonitor->VerifyNotFound();
19790
19791 // Force device idle and clean up remaining objects
19792 vkDeviceWaitIdle(m_device->device());
19793 vkDestroySemaphore(m_device->device(), s2, nullptr);
19794 vkDestroyFence(m_device->device(), fence, nullptr);
19795}
19796
19797TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19798 m_errorMonitor->ExpectSuccess();
19799
Tony Barbour1fa09702017-03-16 12:09:08 -060019800 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019801 VkResult err;
19802
19803 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019804 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019805 VkFence f1;
19806 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19807 ASSERT_VK_SUCCESS(err);
19808
19809 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019810 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019811 VkFence f2;
19812 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19813 ASSERT_VK_SUCCESS(err);
19814
19815 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019816 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019817 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19818
19819 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019820 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019821 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19822
19823 // Should have both retired!
19824 vkDestroyFence(m_device->device(), f1, nullptr);
19825 vkDestroyFence(m_device->device(), f2, nullptr);
19826
19827 m_errorMonitor->VerifyNotFound();
19828}
19829
19830TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019831 TEST_DESCRIPTION(
19832 "Verify that creating an image view from an image with valid usage "
19833 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019834
Tony Barbour1fa09702017-03-16 12:09:08 -060019835 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019836
19837 m_errorMonitor->ExpectSuccess();
19838 // Verify that we can create a view with usage INPUT_ATTACHMENT
19839 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019840 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 -060019841 ASSERT_TRUE(image.initialized());
19842 VkImageView imageView;
19843 VkImageViewCreateInfo ivci = {};
19844 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19845 ivci.image = image.handle();
19846 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19847 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19848 ivci.subresourceRange.layerCount = 1;
19849 ivci.subresourceRange.baseMipLevel = 0;
19850 ivci.subresourceRange.levelCount = 1;
19851 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19852
19853 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19854 m_errorMonitor->VerifyNotFound();
19855 vkDestroyImageView(m_device->device(), imageView, NULL);
19856}
19857
19858// This is a positive test. No failures are expected.
19859TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019860 TEST_DESCRIPTION(
19861 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19862 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019863
Tony Barbour1fa09702017-03-16 12:09:08 -060019864 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019865
19866 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019867 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019868 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019869
19870 m_errorMonitor->ExpectSuccess();
19871
19872 VkImage image;
19873 VkImageCreateInfo image_create_info = {};
19874 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19875 image_create_info.pNext = NULL;
19876 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19877 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19878 image_create_info.extent.width = 64;
19879 image_create_info.extent.height = 64;
19880 image_create_info.extent.depth = 1;
19881 image_create_info.mipLevels = 1;
19882 image_create_info.arrayLayers = 1;
19883 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19884 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19885 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19886 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19887 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19888 ASSERT_VK_SUCCESS(err);
19889
19890 VkMemoryRequirements memory_reqs;
19891 VkDeviceMemory memory_one, memory_two;
19892 bool pass;
19893 VkMemoryAllocateInfo memory_info = {};
19894 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19895 memory_info.pNext = NULL;
19896 memory_info.allocationSize = 0;
19897 memory_info.memoryTypeIndex = 0;
19898 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19899 // Find an image big enough to allow sparse mapping of 2 memory regions
19900 // Increase the image size until it is at least twice the
19901 // size of the required alignment, to ensure we can bind both
19902 // allocated memory blocks to the image on aligned offsets.
19903 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19904 vkDestroyImage(m_device->device(), image, nullptr);
19905 image_create_info.extent.width *= 2;
19906 image_create_info.extent.height *= 2;
19907 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19908 ASSERT_VK_SUCCESS(err);
19909 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19910 }
19911 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19912 // at the end of the first
19913 memory_info.allocationSize = memory_reqs.alignment;
19914 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19915 ASSERT_TRUE(pass);
19916 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19917 ASSERT_VK_SUCCESS(err);
19918 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19919 ASSERT_VK_SUCCESS(err);
19920 VkSparseMemoryBind binds[2];
19921 binds[0].flags = 0;
19922 binds[0].memory = memory_one;
19923 binds[0].memoryOffset = 0;
19924 binds[0].resourceOffset = 0;
19925 binds[0].size = memory_info.allocationSize;
19926 binds[1].flags = 0;
19927 binds[1].memory = memory_two;
19928 binds[1].memoryOffset = 0;
19929 binds[1].resourceOffset = memory_info.allocationSize;
19930 binds[1].size = memory_info.allocationSize;
19931
19932 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19933 opaqueBindInfo.image = image;
19934 opaqueBindInfo.bindCount = 2;
19935 opaqueBindInfo.pBinds = binds;
19936
19937 VkFence fence = VK_NULL_HANDLE;
19938 VkBindSparseInfo bindSparseInfo = {};
19939 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19940 bindSparseInfo.imageOpaqueBindCount = 1;
19941 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19942
19943 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19944 vkQueueWaitIdle(m_device->m_queue);
19945 vkDestroyImage(m_device->device(), image, NULL);
19946 vkFreeMemory(m_device->device(), memory_one, NULL);
19947 vkFreeMemory(m_device->device(), memory_two, NULL);
19948 m_errorMonitor->VerifyNotFound();
19949}
19950
19951TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019952 TEST_DESCRIPTION(
19953 "Ensure that CmdBeginRenderPass with an attachment's "
19954 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19955 "the command buffer has prior knowledge of that "
19956 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019957
19958 m_errorMonitor->ExpectSuccess();
19959
Tony Barbour1fa09702017-03-16 12:09:08 -060019960 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961
19962 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019963 VkAttachmentDescription attachment = {0,
19964 VK_FORMAT_R8G8B8A8_UNORM,
19965 VK_SAMPLE_COUNT_1_BIT,
19966 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19967 VK_ATTACHMENT_STORE_OP_STORE,
19968 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19969 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19970 VK_IMAGE_LAYOUT_UNDEFINED,
19971 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019972
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019973 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019974
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019975 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019976
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019977 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019978
19979 VkRenderPass rp;
19980 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19981 ASSERT_VK_SUCCESS(err);
19982
19983 // A compatible framebuffer.
19984 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019985 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 -060019986 ASSERT_TRUE(image.initialized());
19987
19988 VkImageViewCreateInfo ivci = {
19989 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19990 nullptr,
19991 0,
19992 image.handle(),
19993 VK_IMAGE_VIEW_TYPE_2D,
19994 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019995 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19996 VK_COMPONENT_SWIZZLE_IDENTITY},
19997 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019998 };
19999 VkImageView view;
20000 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20001 ASSERT_VK_SUCCESS(err);
20002
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020003 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020004 VkFramebuffer fb;
20005 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20006 ASSERT_VK_SUCCESS(err);
20007
20008 // Record a single command buffer which uses this renderpass twice. The
20009 // bug is triggered at the beginning of the second renderpass, when the
20010 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020011 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 -070020012 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020013 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20014 vkCmdEndRenderPass(m_commandBuffer->handle());
20015 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20016
20017 m_errorMonitor->VerifyNotFound();
20018
20019 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020020 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020021
20022 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20023 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20024 vkDestroyImageView(m_device->device(), view, nullptr);
20025}
20026
20027TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020028 TEST_DESCRIPTION(
20029 "This test should pass. Create a Framebuffer and "
20030 "command buffer, bind them together, then destroy "
20031 "command pool and framebuffer and verify there are no "
20032 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020033
20034 m_errorMonitor->ExpectSuccess();
20035
Tony Barbour1fa09702017-03-16 12:09:08 -060020036 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037
20038 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020039 VkAttachmentDescription attachment = {0,
20040 VK_FORMAT_R8G8B8A8_UNORM,
20041 VK_SAMPLE_COUNT_1_BIT,
20042 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20043 VK_ATTACHMENT_STORE_OP_STORE,
20044 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20045 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20046 VK_IMAGE_LAYOUT_UNDEFINED,
20047 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020048
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020049 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020050
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020051 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020052
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020053 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020054
20055 VkRenderPass rp;
20056 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20057 ASSERT_VK_SUCCESS(err);
20058
20059 // A compatible framebuffer.
20060 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020061 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 -060020062 ASSERT_TRUE(image.initialized());
20063
20064 VkImageViewCreateInfo ivci = {
20065 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20066 nullptr,
20067 0,
20068 image.handle(),
20069 VK_IMAGE_VIEW_TYPE_2D,
20070 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020071 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20072 VK_COMPONENT_SWIZZLE_IDENTITY},
20073 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020074 };
20075 VkImageView view;
20076 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20077 ASSERT_VK_SUCCESS(err);
20078
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020079 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080 VkFramebuffer fb;
20081 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20082 ASSERT_VK_SUCCESS(err);
20083
20084 // Explicitly create a command buffer to bind the FB to so that we can then
20085 // destroy the command pool in order to implicitly free command buffer
20086 VkCommandPool command_pool;
20087 VkCommandPoolCreateInfo pool_create_info{};
20088 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20089 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20090 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20091 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20092
20093 VkCommandBuffer command_buffer;
20094 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20095 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20096 command_buffer_allocate_info.commandPool = command_pool;
20097 command_buffer_allocate_info.commandBufferCount = 1;
20098 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20099 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20100
20101 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020102 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 -060020103 VkCommandBufferBeginInfo begin_info{};
20104 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20105 vkBeginCommandBuffer(command_buffer, &begin_info);
20106
20107 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20108 vkCmdEndRenderPass(command_buffer);
20109 vkEndCommandBuffer(command_buffer);
20110 vkDestroyImageView(m_device->device(), view, nullptr);
20111 // Destroy command pool to implicitly free command buffer
20112 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20113 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20114 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20115 m_errorMonitor->VerifyNotFound();
20116}
20117
20118TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020119 TEST_DESCRIPTION(
20120 "Ensure that CmdBeginRenderPass applies the layout "
20121 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020122
20123 m_errorMonitor->ExpectSuccess();
20124
Tony Barbour1fa09702017-03-16 12:09:08 -060020125 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020126
20127 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020128 VkAttachmentDescription attachment = {0,
20129 VK_FORMAT_R8G8B8A8_UNORM,
20130 VK_SAMPLE_COUNT_1_BIT,
20131 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20132 VK_ATTACHMENT_STORE_OP_STORE,
20133 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20134 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20135 VK_IMAGE_LAYOUT_UNDEFINED,
20136 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020137
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020138 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020139
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020140 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020141
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020142 VkSubpassDependency dep = {0,
20143 0,
20144 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20145 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20146 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20147 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20148 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020149
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020150 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151
20152 VkResult err;
20153 VkRenderPass rp;
20154 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20155 ASSERT_VK_SUCCESS(err);
20156
20157 // A compatible framebuffer.
20158 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020159 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 -060020160 ASSERT_TRUE(image.initialized());
20161
20162 VkImageViewCreateInfo ivci = {
20163 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20164 nullptr,
20165 0,
20166 image.handle(),
20167 VK_IMAGE_VIEW_TYPE_2D,
20168 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020169 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20170 VK_COMPONENT_SWIZZLE_IDENTITY},
20171 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172 };
20173 VkImageView view;
20174 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20175 ASSERT_VK_SUCCESS(err);
20176
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020177 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020178 VkFramebuffer fb;
20179 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20180 ASSERT_VK_SUCCESS(err);
20181
20182 // Record a single command buffer which issues a pipeline barrier w/
20183 // image memory barrier for the attachment. This detects the previously
20184 // missing tracking of the subpass layout by throwing a validation error
20185 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020186 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 -070020187 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020188 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20189
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020190 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20191 nullptr,
20192 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20193 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20194 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20195 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20196 VK_QUEUE_FAMILY_IGNORED,
20197 VK_QUEUE_FAMILY_IGNORED,
20198 image.handle(),
20199 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020200 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020201 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20202 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203
20204 vkCmdEndRenderPass(m_commandBuffer->handle());
20205 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020206 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020207
20208 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20209 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20210 vkDestroyImageView(m_device->device(), view, nullptr);
20211}
20212
20213TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020214 TEST_DESCRIPTION(
20215 "Validate that when an imageView of a depth/stencil image "
20216 "is used as a depth/stencil framebuffer attachment, the "
20217 "aspectMask is ignored and both depth and stencil image "
20218 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020219
Tony Barbour1fa09702017-03-16 12:09:08 -060020220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020221 VkFormatProperties format_properties;
20222 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20223 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20224 return;
20225 }
20226
20227 m_errorMonitor->ExpectSuccess();
20228
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020229 VkAttachmentDescription attachment = {0,
20230 VK_FORMAT_D32_SFLOAT_S8_UINT,
20231 VK_SAMPLE_COUNT_1_BIT,
20232 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20233 VK_ATTACHMENT_STORE_OP_STORE,
20234 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20235 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20236 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20237 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020238
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020239 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020240
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020241 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020242
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020243 VkSubpassDependency dep = {0,
20244 0,
20245 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20246 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20247 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20248 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20249 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020250
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020251 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020252
20253 VkResult err;
20254 VkRenderPass rp;
20255 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20256 ASSERT_VK_SUCCESS(err);
20257
20258 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020259 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20260 0x26, // usage
20261 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020262 ASSERT_TRUE(image.initialized());
20263 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20264
20265 VkImageViewCreateInfo ivci = {
20266 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20267 nullptr,
20268 0,
20269 image.handle(),
20270 VK_IMAGE_VIEW_TYPE_2D,
20271 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020272 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20273 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020274 };
20275 VkImageView view;
20276 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20277 ASSERT_VK_SUCCESS(err);
20278
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020279 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020280 VkFramebuffer fb;
20281 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20282 ASSERT_VK_SUCCESS(err);
20283
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020284 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 -070020285 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020286 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20287
20288 VkImageMemoryBarrier imb = {};
20289 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20290 imb.pNext = nullptr;
20291 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20292 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20293 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20294 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20295 imb.srcQueueFamilyIndex = 0;
20296 imb.dstQueueFamilyIndex = 0;
20297 imb.image = image.handle();
20298 imb.subresourceRange.aspectMask = 0x6;
20299 imb.subresourceRange.baseMipLevel = 0;
20300 imb.subresourceRange.levelCount = 0x1;
20301 imb.subresourceRange.baseArrayLayer = 0;
20302 imb.subresourceRange.layerCount = 0x1;
20303
20304 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020305 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20306 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020307
20308 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020309 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020310 QueueCommandBuffer(false);
20311 m_errorMonitor->VerifyNotFound();
20312
20313 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20315 vkDestroyImageView(m_device->device(), view, nullptr);
20316}
20317
20318TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020319 TEST_DESCRIPTION(
20320 "Ensure that layout transitions work correctly without "
20321 "errors, when an attachment reference is "
20322 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020323
20324 m_errorMonitor->ExpectSuccess();
20325
Tony Barbour1fa09702017-03-16 12:09:08 -060020326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020327
20328 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020329 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020330
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020331 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020332
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020333 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020334
20335 VkRenderPass rp;
20336 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20337 ASSERT_VK_SUCCESS(err);
20338
20339 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020340 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020341 VkFramebuffer fb;
20342 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20343 ASSERT_VK_SUCCESS(err);
20344
20345 // Record a command buffer which just begins and ends the renderpass. The
20346 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020347 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 -070020348 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020349 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20350 vkCmdEndRenderPass(m_commandBuffer->handle());
20351 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020352 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020353
20354 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20355 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20356}
20357
20358// This is a positive test. No errors are expected.
20359TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020360 TEST_DESCRIPTION(
20361 "Create a stencil-only attachment with a LOAD_OP set to "
20362 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020363 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020364 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020365 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020366 if (!depth_format) {
20367 printf(" No Depth + Stencil format found. Skipped.\n");
20368 return;
20369 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020370 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020371 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020372 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20373 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020374 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20375 return;
20376 }
20377
Tony Barbourf887b162017-03-09 10:06:46 -070020378 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020379 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020380 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020381 VkAttachmentDescription att = {};
20382 VkAttachmentReference ref = {};
20383 att.format = depth_stencil_fmt;
20384 att.samples = VK_SAMPLE_COUNT_1_BIT;
20385 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20386 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20387 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20388 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20389 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20390 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20391
20392 VkClearValue clear;
20393 clear.depthStencil.depth = 1.0;
20394 clear.depthStencil.stencil = 0;
20395 ref.attachment = 0;
20396 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20397
20398 VkSubpassDescription subpass = {};
20399 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20400 subpass.flags = 0;
20401 subpass.inputAttachmentCount = 0;
20402 subpass.pInputAttachments = NULL;
20403 subpass.colorAttachmentCount = 0;
20404 subpass.pColorAttachments = NULL;
20405 subpass.pResolveAttachments = NULL;
20406 subpass.pDepthStencilAttachment = &ref;
20407 subpass.preserveAttachmentCount = 0;
20408 subpass.pPreserveAttachments = NULL;
20409
20410 VkRenderPass rp;
20411 VkRenderPassCreateInfo rp_info = {};
20412 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20413 rp_info.attachmentCount = 1;
20414 rp_info.pAttachments = &att;
20415 rp_info.subpassCount = 1;
20416 rp_info.pSubpasses = &subpass;
20417 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20418 ASSERT_VK_SUCCESS(result);
20419
20420 VkImageView *depthView = m_depthStencil->BindInfo();
20421 VkFramebufferCreateInfo fb_info = {};
20422 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20423 fb_info.pNext = NULL;
20424 fb_info.renderPass = rp;
20425 fb_info.attachmentCount = 1;
20426 fb_info.pAttachments = depthView;
20427 fb_info.width = 100;
20428 fb_info.height = 100;
20429 fb_info.layers = 1;
20430 VkFramebuffer fb;
20431 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20432 ASSERT_VK_SUCCESS(result);
20433
20434 VkRenderPassBeginInfo rpbinfo = {};
20435 rpbinfo.clearValueCount = 1;
20436 rpbinfo.pClearValues = &clear;
20437 rpbinfo.pNext = NULL;
20438 rpbinfo.renderPass = rp;
20439 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20440 rpbinfo.renderArea.extent.width = 100;
20441 rpbinfo.renderArea.extent.height = 100;
20442 rpbinfo.renderArea.offset.x = 0;
20443 rpbinfo.renderArea.offset.y = 0;
20444 rpbinfo.framebuffer = fb;
20445
20446 VkFence fence = {};
20447 VkFenceCreateInfo fence_ci = {};
20448 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20449 fence_ci.pNext = nullptr;
20450 fence_ci.flags = 0;
20451 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20452 ASSERT_VK_SUCCESS(result);
20453
20454 m_commandBuffer->BeginCommandBuffer();
20455 m_commandBuffer->BeginRenderPass(rpbinfo);
20456 m_commandBuffer->EndRenderPass();
20457 m_commandBuffer->EndCommandBuffer();
20458 m_commandBuffer->QueueCommandBuffer(fence);
20459
20460 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020461 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 -070020462 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020463 VkImageMemoryBarrier barrier = {};
20464 VkImageSubresourceRange range;
20465 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20466 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20467 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20468 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20469 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20470 barrier.image = m_depthStencil->handle();
20471 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20472 range.baseMipLevel = 0;
20473 range.levelCount = 1;
20474 range.baseArrayLayer = 0;
20475 range.layerCount = 1;
20476 barrier.subresourceRange = range;
20477 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20478 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20479 cmdbuf.BeginCommandBuffer();
20480 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 -070020481 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020482 barrier.srcAccessMask = 0;
20483 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20484 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20485 barrier.image = destImage.handle();
20486 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20487 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 -070020488 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020489 VkImageCopy cregion;
20490 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20491 cregion.srcSubresource.mipLevel = 0;
20492 cregion.srcSubresource.baseArrayLayer = 0;
20493 cregion.srcSubresource.layerCount = 1;
20494 cregion.srcOffset.x = 0;
20495 cregion.srcOffset.y = 0;
20496 cregion.srcOffset.z = 0;
20497 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20498 cregion.dstSubresource.mipLevel = 0;
20499 cregion.dstSubresource.baseArrayLayer = 0;
20500 cregion.dstSubresource.layerCount = 1;
20501 cregion.dstOffset.x = 0;
20502 cregion.dstOffset.y = 0;
20503 cregion.dstOffset.z = 0;
20504 cregion.extent.width = 100;
20505 cregion.extent.height = 100;
20506 cregion.extent.depth = 1;
20507 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020508 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020509 cmdbuf.EndCommandBuffer();
20510
20511 VkSubmitInfo submit_info;
20512 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20513 submit_info.pNext = NULL;
20514 submit_info.waitSemaphoreCount = 0;
20515 submit_info.pWaitSemaphores = NULL;
20516 submit_info.pWaitDstStageMask = NULL;
20517 submit_info.commandBufferCount = 1;
20518 submit_info.pCommandBuffers = &cmdbuf.handle();
20519 submit_info.signalSemaphoreCount = 0;
20520 submit_info.pSignalSemaphores = NULL;
20521
20522 m_errorMonitor->ExpectSuccess();
20523 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20524 m_errorMonitor->VerifyNotFound();
20525
20526 vkQueueWaitIdle(m_device->m_queue);
20527 vkDestroyFence(m_device->device(), fence, nullptr);
20528 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20529 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20530}
20531
20532// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020533TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20534 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20535
20536 m_errorMonitor->ExpectSuccess();
20537
Tony Barbour1fa09702017-03-16 12:09:08 -060020538 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020539 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020540 if (!depth_format) {
20541 printf(" No Depth + Stencil format found. Skipped.\n");
20542 return;
20543 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20545
20546 VkImageMemoryBarrier img_barrier = {};
20547 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20548 img_barrier.pNext = NULL;
20549 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20550 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20551 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20552 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20553 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20554 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20555 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20556 img_barrier.subresourceRange.baseArrayLayer = 0;
20557 img_barrier.subresourceRange.baseMipLevel = 0;
20558 img_barrier.subresourceRange.layerCount = 1;
20559 img_barrier.subresourceRange.levelCount = 1;
20560
20561 {
20562 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020563 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 -070020564 ASSERT_TRUE(img_color.initialized());
20565
20566 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020567 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 -070020568 ASSERT_TRUE(img_ds1.initialized());
20569
20570 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020571 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 -070020572 ASSERT_TRUE(img_ds2.initialized());
20573
20574 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020575 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 -070020576 ASSERT_TRUE(img_xfer_src.initialized());
20577
20578 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020579 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 -070020580 ASSERT_TRUE(img_xfer_dst.initialized());
20581
20582 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020583 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 -070020584 ASSERT_TRUE(img_sampled.initialized());
20585
20586 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020587 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 -070020588 ASSERT_TRUE(img_input.initialized());
20589
20590 const struct {
20591 VkImageObj &image_obj;
20592 VkImageLayout old_layout;
20593 VkImageLayout new_layout;
20594 } buffer_layouts[] = {
20595 // clang-format off
20596 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20597 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20598 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20599 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20600 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20601 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20602 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20603 // clang-format on
20604 };
20605 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20606
20607 m_commandBuffer->BeginCommandBuffer();
20608 for (uint32_t i = 0; i < layout_count; ++i) {
20609 img_barrier.image = buffer_layouts[i].image_obj.handle();
20610 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20611 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20612 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20613 : VK_IMAGE_ASPECT_COLOR_BIT;
20614
20615 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20616 img_barrier.newLayout = buffer_layouts[i].new_layout;
20617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20618 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20619
20620 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20621 img_barrier.newLayout = buffer_layouts[i].old_layout;
20622 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20623 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20624 }
20625 m_commandBuffer->EndCommandBuffer();
20626
20627 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20628 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20629 }
20630 m_errorMonitor->VerifyNotFound();
20631}
20632
20633// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020634TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20635 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20636
20637 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020638 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020639
20640 VkEvent event;
20641 VkEventCreateInfo event_create_info{};
20642 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20643 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20644
20645 VkCommandPool command_pool;
20646 VkCommandPoolCreateInfo pool_create_info{};
20647 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20648 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20649 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20650 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20651
20652 VkCommandBuffer command_buffer;
20653 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20654 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20655 command_buffer_allocate_info.commandPool = command_pool;
20656 command_buffer_allocate_info.commandBufferCount = 1;
20657 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20658 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20659
20660 VkQueue queue = VK_NULL_HANDLE;
20661 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20662
20663 {
20664 VkCommandBufferBeginInfo begin_info{};
20665 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20666 vkBeginCommandBuffer(command_buffer, &begin_info);
20667
20668 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 -070020669 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020670 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20671 vkEndCommandBuffer(command_buffer);
20672 }
20673 {
20674 VkSubmitInfo submit_info{};
20675 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20676 submit_info.commandBufferCount = 1;
20677 submit_info.pCommandBuffers = &command_buffer;
20678 submit_info.signalSemaphoreCount = 0;
20679 submit_info.pSignalSemaphores = nullptr;
20680 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20681 }
20682 { vkSetEvent(m_device->device(), event); }
20683
20684 vkQueueWaitIdle(queue);
20685
20686 vkDestroyEvent(m_device->device(), event, nullptr);
20687 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20688 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20689
20690 m_errorMonitor->VerifyNotFound();
20691}
20692// This is a positive test. No errors should be generated.
20693TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20694 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20695
Tony Barbour1fa09702017-03-16 12:09:08 -060020696 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020697 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020698
20699 m_errorMonitor->ExpectSuccess();
20700
20701 VkQueryPool query_pool;
20702 VkQueryPoolCreateInfo query_pool_create_info{};
20703 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20704 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20705 query_pool_create_info.queryCount = 1;
20706 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20707
20708 VkCommandPool command_pool;
20709 VkCommandPoolCreateInfo pool_create_info{};
20710 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20711 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20712 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20713 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20714
20715 VkCommandBuffer command_buffer;
20716 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20717 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20718 command_buffer_allocate_info.commandPool = command_pool;
20719 command_buffer_allocate_info.commandBufferCount = 1;
20720 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20721 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20722
20723 VkCommandBuffer secondary_command_buffer;
20724 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20725 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20726
20727 VkQueue queue = VK_NULL_HANDLE;
20728 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20729
20730 uint32_t qfi = 0;
20731 VkBufferCreateInfo buff_create_info = {};
20732 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20733 buff_create_info.size = 1024;
20734 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20735 buff_create_info.queueFamilyIndexCount = 1;
20736 buff_create_info.pQueueFamilyIndices = &qfi;
20737
20738 VkResult err;
20739 VkBuffer buffer;
20740 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20741 ASSERT_VK_SUCCESS(err);
20742 VkMemoryAllocateInfo mem_alloc = {};
20743 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20744 mem_alloc.pNext = NULL;
20745 mem_alloc.allocationSize = 1024;
20746 mem_alloc.memoryTypeIndex = 0;
20747
20748 VkMemoryRequirements memReqs;
20749 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20750 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20751 if (!pass) {
20752 vkDestroyBuffer(m_device->device(), buffer, NULL);
20753 return;
20754 }
20755
20756 VkDeviceMemory mem;
20757 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20758 ASSERT_VK_SUCCESS(err);
20759 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20760 ASSERT_VK_SUCCESS(err);
20761
20762 VkCommandBufferInheritanceInfo hinfo = {};
20763 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20764 hinfo.renderPass = VK_NULL_HANDLE;
20765 hinfo.subpass = 0;
20766 hinfo.framebuffer = VK_NULL_HANDLE;
20767 hinfo.occlusionQueryEnable = VK_FALSE;
20768 hinfo.queryFlags = 0;
20769 hinfo.pipelineStatistics = 0;
20770
20771 {
20772 VkCommandBufferBeginInfo begin_info{};
20773 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20774 begin_info.pInheritanceInfo = &hinfo;
20775 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20776
20777 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20778 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20779
20780 vkEndCommandBuffer(secondary_command_buffer);
20781
20782 begin_info.pInheritanceInfo = nullptr;
20783 vkBeginCommandBuffer(command_buffer, &begin_info);
20784
20785 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20786 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20787
20788 vkEndCommandBuffer(command_buffer);
20789 }
20790 {
20791 VkSubmitInfo submit_info{};
20792 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20793 submit_info.commandBufferCount = 1;
20794 submit_info.pCommandBuffers = &command_buffer;
20795 submit_info.signalSemaphoreCount = 0;
20796 submit_info.pSignalSemaphores = nullptr;
20797 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20798 }
20799
20800 vkQueueWaitIdle(queue);
20801
20802 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20803 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20804 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20805 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20806 vkDestroyBuffer(m_device->device(), buffer, NULL);
20807 vkFreeMemory(m_device->device(), mem, NULL);
20808
20809 m_errorMonitor->VerifyNotFound();
20810}
20811
20812// This is a positive test. No errors should be generated.
20813TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20814 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20815
Tony Barbour1fa09702017-03-16 12:09:08 -060020816 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020817 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020818
20819 m_errorMonitor->ExpectSuccess();
20820
20821 VkQueryPool query_pool;
20822 VkQueryPoolCreateInfo query_pool_create_info{};
20823 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20824 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20825 query_pool_create_info.queryCount = 1;
20826 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20827
20828 VkCommandPool command_pool;
20829 VkCommandPoolCreateInfo pool_create_info{};
20830 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20831 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20832 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20833 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20834
20835 VkCommandBuffer command_buffer[2];
20836 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20837 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20838 command_buffer_allocate_info.commandPool = command_pool;
20839 command_buffer_allocate_info.commandBufferCount = 2;
20840 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20841 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20842
20843 VkQueue queue = VK_NULL_HANDLE;
20844 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20845
20846 uint32_t qfi = 0;
20847 VkBufferCreateInfo buff_create_info = {};
20848 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20849 buff_create_info.size = 1024;
20850 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20851 buff_create_info.queueFamilyIndexCount = 1;
20852 buff_create_info.pQueueFamilyIndices = &qfi;
20853
20854 VkResult err;
20855 VkBuffer buffer;
20856 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20857 ASSERT_VK_SUCCESS(err);
20858 VkMemoryAllocateInfo mem_alloc = {};
20859 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20860 mem_alloc.pNext = NULL;
20861 mem_alloc.allocationSize = 1024;
20862 mem_alloc.memoryTypeIndex = 0;
20863
20864 VkMemoryRequirements memReqs;
20865 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20866 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20867 if (!pass) {
20868 vkDestroyBuffer(m_device->device(), buffer, NULL);
20869 return;
20870 }
20871
20872 VkDeviceMemory mem;
20873 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20874 ASSERT_VK_SUCCESS(err);
20875 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20876 ASSERT_VK_SUCCESS(err);
20877
20878 {
20879 VkCommandBufferBeginInfo begin_info{};
20880 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20881 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20882
20883 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20884 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20885
20886 vkEndCommandBuffer(command_buffer[0]);
20887
20888 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20889
20890 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20891
20892 vkEndCommandBuffer(command_buffer[1]);
20893 }
20894 {
20895 VkSubmitInfo submit_info{};
20896 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20897 submit_info.commandBufferCount = 2;
20898 submit_info.pCommandBuffers = command_buffer;
20899 submit_info.signalSemaphoreCount = 0;
20900 submit_info.pSignalSemaphores = nullptr;
20901 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20902 }
20903
20904 vkQueueWaitIdle(queue);
20905
20906 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20907 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20908 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20909 vkDestroyBuffer(m_device->device(), buffer, NULL);
20910 vkFreeMemory(m_device->device(), mem, NULL);
20911
20912 m_errorMonitor->VerifyNotFound();
20913}
20914
Tony Barbourc46924f2016-11-04 11:49:52 -060020915TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020916 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20917
Tony Barbour1fa09702017-03-16 12:09:08 -060020918 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020919 VkEvent event;
20920 VkEventCreateInfo event_create_info{};
20921 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20922 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20923
20924 VkCommandPool command_pool;
20925 VkCommandPoolCreateInfo pool_create_info{};
20926 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20927 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20928 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20929 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20930
20931 VkCommandBuffer command_buffer;
20932 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20933 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20934 command_buffer_allocate_info.commandPool = command_pool;
20935 command_buffer_allocate_info.commandBufferCount = 1;
20936 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20937 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20938
20939 VkQueue queue = VK_NULL_HANDLE;
20940 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20941
20942 {
20943 VkCommandBufferBeginInfo begin_info{};
20944 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20945 vkBeginCommandBuffer(command_buffer, &begin_info);
20946
20947 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020948 vkEndCommandBuffer(command_buffer);
20949 }
20950 {
20951 VkSubmitInfo submit_info{};
20952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20953 submit_info.commandBufferCount = 1;
20954 submit_info.pCommandBuffers = &command_buffer;
20955 submit_info.signalSemaphoreCount = 0;
20956 submit_info.pSignalSemaphores = nullptr;
20957 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20958 }
20959 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20961 "that is already in use by a "
20962 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020963 vkSetEvent(m_device->device(), event);
20964 m_errorMonitor->VerifyFound();
20965 }
20966
20967 vkQueueWaitIdle(queue);
20968
20969 vkDestroyEvent(m_device->device(), event, nullptr);
20970 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20971 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20972}
20973
20974// This is a positive test. No errors should be generated.
20975TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020976 TEST_DESCRIPTION(
20977 "Two command buffers with two separate fences are each "
20978 "run through a Submit & WaitForFences cycle 3 times. This "
20979 "previously revealed a bug so running this positive test "
20980 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020981 m_errorMonitor->ExpectSuccess();
20982
Tony Barbour1fa09702017-03-16 12:09:08 -060020983 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020984 VkQueue queue = VK_NULL_HANDLE;
20985 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20986
20987 static const uint32_t NUM_OBJECTS = 2;
20988 static const uint32_t NUM_FRAMES = 3;
20989 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20990 VkFence fences[NUM_OBJECTS] = {};
20991
20992 VkCommandPool cmd_pool;
20993 VkCommandPoolCreateInfo cmd_pool_ci = {};
20994 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20995 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20996 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20997 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20998 ASSERT_VK_SUCCESS(err);
20999
21000 VkCommandBufferAllocateInfo cmd_buf_info = {};
21001 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21002 cmd_buf_info.commandPool = cmd_pool;
21003 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21004 cmd_buf_info.commandBufferCount = 1;
21005
21006 VkFenceCreateInfo fence_ci = {};
21007 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21008 fence_ci.pNext = nullptr;
21009 fence_ci.flags = 0;
21010
21011 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21012 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21013 ASSERT_VK_SUCCESS(err);
21014 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21015 ASSERT_VK_SUCCESS(err);
21016 }
21017
21018 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21019 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21020 // Create empty cmd buffer
21021 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21022 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21023
21024 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21025 ASSERT_VK_SUCCESS(err);
21026 err = vkEndCommandBuffer(cmd_buffers[obj]);
21027 ASSERT_VK_SUCCESS(err);
21028
21029 VkSubmitInfo submit_info = {};
21030 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21031 submit_info.commandBufferCount = 1;
21032 submit_info.pCommandBuffers = &cmd_buffers[obj];
21033 // Submit cmd buffer and wait for fence
21034 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21035 ASSERT_VK_SUCCESS(err);
21036 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21037 ASSERT_VK_SUCCESS(err);
21038 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21039 ASSERT_VK_SUCCESS(err);
21040 }
21041 }
21042 m_errorMonitor->VerifyNotFound();
21043 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21044 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21045 vkDestroyFence(m_device->device(), fences[i], nullptr);
21046 }
21047}
21048// This is a positive test. No errors should be generated.
21049TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021050 TEST_DESCRIPTION(
21051 "Two command buffers, each in a separate QueueSubmit call "
21052 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021053
Tony Barbour1fa09702017-03-16 12:09:08 -060021054 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021055 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021056
21057 m_errorMonitor->ExpectSuccess();
21058
21059 VkSemaphore semaphore;
21060 VkSemaphoreCreateInfo semaphore_create_info{};
21061 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21062 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21063
21064 VkCommandPool command_pool;
21065 VkCommandPoolCreateInfo pool_create_info{};
21066 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21067 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21068 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21069 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21070
21071 VkCommandBuffer command_buffer[2];
21072 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21073 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21074 command_buffer_allocate_info.commandPool = command_pool;
21075 command_buffer_allocate_info.commandBufferCount = 2;
21076 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21077 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21078
21079 VkQueue queue = VK_NULL_HANDLE;
21080 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21081
21082 {
21083 VkCommandBufferBeginInfo begin_info{};
21084 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21085 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21086
21087 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 -070021088 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021089
21090 VkViewport viewport{};
21091 viewport.maxDepth = 1.0f;
21092 viewport.minDepth = 0.0f;
21093 viewport.width = 512;
21094 viewport.height = 512;
21095 viewport.x = 0;
21096 viewport.y = 0;
21097 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21098 vkEndCommandBuffer(command_buffer[0]);
21099 }
21100 {
21101 VkCommandBufferBeginInfo begin_info{};
21102 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21103 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21104
21105 VkViewport viewport{};
21106 viewport.maxDepth = 1.0f;
21107 viewport.minDepth = 0.0f;
21108 viewport.width = 512;
21109 viewport.height = 512;
21110 viewport.x = 0;
21111 viewport.y = 0;
21112 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21113 vkEndCommandBuffer(command_buffer[1]);
21114 }
21115 {
21116 VkSubmitInfo submit_info{};
21117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21118 submit_info.commandBufferCount = 1;
21119 submit_info.pCommandBuffers = &command_buffer[0];
21120 submit_info.signalSemaphoreCount = 1;
21121 submit_info.pSignalSemaphores = &semaphore;
21122 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21123 }
21124 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021125 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021126 VkSubmitInfo submit_info{};
21127 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21128 submit_info.commandBufferCount = 1;
21129 submit_info.pCommandBuffers = &command_buffer[1];
21130 submit_info.waitSemaphoreCount = 1;
21131 submit_info.pWaitSemaphores = &semaphore;
21132 submit_info.pWaitDstStageMask = flags;
21133 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21134 }
21135
21136 vkQueueWaitIdle(m_device->m_queue);
21137
21138 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21139 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21140 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21141
21142 m_errorMonitor->VerifyNotFound();
21143}
21144
21145// This is a positive test. No errors should be generated.
21146TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021147 TEST_DESCRIPTION(
21148 "Two command buffers, each in a separate QueueSubmit call "
21149 "submitted on separate queues, the second having a fence"
21150 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021151
Tony Barbour1fa09702017-03-16 12:09:08 -060021152 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021153 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021154
21155 m_errorMonitor->ExpectSuccess();
21156
21157 VkFence fence;
21158 VkFenceCreateInfo fence_create_info{};
21159 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21160 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21161
21162 VkSemaphore semaphore;
21163 VkSemaphoreCreateInfo semaphore_create_info{};
21164 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21165 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21166
21167 VkCommandPool command_pool;
21168 VkCommandPoolCreateInfo pool_create_info{};
21169 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21170 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21171 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21172 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21173
21174 VkCommandBuffer command_buffer[2];
21175 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21176 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21177 command_buffer_allocate_info.commandPool = command_pool;
21178 command_buffer_allocate_info.commandBufferCount = 2;
21179 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21180 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21181
21182 VkQueue queue = VK_NULL_HANDLE;
21183 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21184
21185 {
21186 VkCommandBufferBeginInfo begin_info{};
21187 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21188 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21189
21190 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 -070021191 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021192
21193 VkViewport viewport{};
21194 viewport.maxDepth = 1.0f;
21195 viewport.minDepth = 0.0f;
21196 viewport.width = 512;
21197 viewport.height = 512;
21198 viewport.x = 0;
21199 viewport.y = 0;
21200 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21201 vkEndCommandBuffer(command_buffer[0]);
21202 }
21203 {
21204 VkCommandBufferBeginInfo begin_info{};
21205 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21206 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21207
21208 VkViewport viewport{};
21209 viewport.maxDepth = 1.0f;
21210 viewport.minDepth = 0.0f;
21211 viewport.width = 512;
21212 viewport.height = 512;
21213 viewport.x = 0;
21214 viewport.y = 0;
21215 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21216 vkEndCommandBuffer(command_buffer[1]);
21217 }
21218 {
21219 VkSubmitInfo submit_info{};
21220 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21221 submit_info.commandBufferCount = 1;
21222 submit_info.pCommandBuffers = &command_buffer[0];
21223 submit_info.signalSemaphoreCount = 1;
21224 submit_info.pSignalSemaphores = &semaphore;
21225 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21226 }
21227 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021228 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021229 VkSubmitInfo submit_info{};
21230 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21231 submit_info.commandBufferCount = 1;
21232 submit_info.pCommandBuffers = &command_buffer[1];
21233 submit_info.waitSemaphoreCount = 1;
21234 submit_info.pWaitSemaphores = &semaphore;
21235 submit_info.pWaitDstStageMask = flags;
21236 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21237 }
21238
21239 vkQueueWaitIdle(m_device->m_queue);
21240
21241 vkDestroyFence(m_device->device(), fence, nullptr);
21242 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21243 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21244 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21245
21246 m_errorMonitor->VerifyNotFound();
21247}
21248
21249// This is a positive test. No errors should be generated.
21250TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021251 TEST_DESCRIPTION(
21252 "Two command buffers, each in a separate QueueSubmit call "
21253 "submitted on separate queues, the second having a fence"
21254 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021255
Tony Barbour1fa09702017-03-16 12:09:08 -060021256 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021257 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021258
21259 m_errorMonitor->ExpectSuccess();
21260
21261 VkFence fence;
21262 VkFenceCreateInfo fence_create_info{};
21263 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21264 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21265
21266 VkSemaphore semaphore;
21267 VkSemaphoreCreateInfo semaphore_create_info{};
21268 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21269 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21270
21271 VkCommandPool command_pool;
21272 VkCommandPoolCreateInfo pool_create_info{};
21273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21274 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21275 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21276 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21277
21278 VkCommandBuffer command_buffer[2];
21279 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21280 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21281 command_buffer_allocate_info.commandPool = command_pool;
21282 command_buffer_allocate_info.commandBufferCount = 2;
21283 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21284 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21285
21286 VkQueue queue = VK_NULL_HANDLE;
21287 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21288
21289 {
21290 VkCommandBufferBeginInfo begin_info{};
21291 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21292 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21293
21294 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 -070021295 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021296
21297 VkViewport viewport{};
21298 viewport.maxDepth = 1.0f;
21299 viewport.minDepth = 0.0f;
21300 viewport.width = 512;
21301 viewport.height = 512;
21302 viewport.x = 0;
21303 viewport.y = 0;
21304 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21305 vkEndCommandBuffer(command_buffer[0]);
21306 }
21307 {
21308 VkCommandBufferBeginInfo begin_info{};
21309 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21310 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21311
21312 VkViewport viewport{};
21313 viewport.maxDepth = 1.0f;
21314 viewport.minDepth = 0.0f;
21315 viewport.width = 512;
21316 viewport.height = 512;
21317 viewport.x = 0;
21318 viewport.y = 0;
21319 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21320 vkEndCommandBuffer(command_buffer[1]);
21321 }
21322 {
21323 VkSubmitInfo submit_info{};
21324 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21325 submit_info.commandBufferCount = 1;
21326 submit_info.pCommandBuffers = &command_buffer[0];
21327 submit_info.signalSemaphoreCount = 1;
21328 submit_info.pSignalSemaphores = &semaphore;
21329 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21330 }
21331 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021332 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021333 VkSubmitInfo submit_info{};
21334 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21335 submit_info.commandBufferCount = 1;
21336 submit_info.pCommandBuffers = &command_buffer[1];
21337 submit_info.waitSemaphoreCount = 1;
21338 submit_info.pWaitSemaphores = &semaphore;
21339 submit_info.pWaitDstStageMask = flags;
21340 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21341 }
21342
21343 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21344 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21345
21346 vkDestroyFence(m_device->device(), fence, nullptr);
21347 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21348 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21349 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21350
21351 m_errorMonitor->VerifyNotFound();
21352}
21353
21354TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021355 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021357 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021358 return;
21359 }
21360
21361 VkResult err;
21362
21363 m_errorMonitor->ExpectSuccess();
21364
21365 VkQueue q0 = m_device->m_queue;
21366 VkQueue q1 = nullptr;
21367 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21368 ASSERT_NE(q1, nullptr);
21369
21370 // An (empty) command buffer. We must have work in the first submission --
21371 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021372 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021373 VkCommandPool pool;
21374 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21375 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021376 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21377 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021378 VkCommandBuffer cb;
21379 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21380 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021381 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021382 err = vkBeginCommandBuffer(cb, &cbbi);
21383 ASSERT_VK_SUCCESS(err);
21384 err = vkEndCommandBuffer(cb);
21385 ASSERT_VK_SUCCESS(err);
21386
21387 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021388 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021389 VkSemaphore s;
21390 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21391 ASSERT_VK_SUCCESS(err);
21392
21393 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021394 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021395
21396 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21397 ASSERT_VK_SUCCESS(err);
21398
21399 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021400 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021401 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021402
21403 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21404 ASSERT_VK_SUCCESS(err);
21405
21406 // Wait for q0 idle
21407 err = vkQueueWaitIdle(q0);
21408 ASSERT_VK_SUCCESS(err);
21409
21410 // Command buffer should have been completed (it was on q0); reset the pool.
21411 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21412
21413 m_errorMonitor->VerifyNotFound();
21414
21415 // Force device completely idle and clean up resources
21416 vkDeviceWaitIdle(m_device->device());
21417 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21418 vkDestroySemaphore(m_device->device(), s, nullptr);
21419}
21420
21421// This is a positive test. No errors should be generated.
21422TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021423 TEST_DESCRIPTION(
21424 "Two command buffers, each in a separate QueueSubmit call "
21425 "submitted on separate queues, the second having a fence, "
21426 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021427
Tony Barbour1fa09702017-03-16 12:09:08 -060021428 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021429 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021430
21431 m_errorMonitor->ExpectSuccess();
21432
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021433 VkFence fence;
21434 VkFenceCreateInfo fence_create_info{};
21435 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21436 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21437
21438 VkSemaphore semaphore;
21439 VkSemaphoreCreateInfo semaphore_create_info{};
21440 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21441 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21442
21443 VkCommandPool command_pool;
21444 VkCommandPoolCreateInfo pool_create_info{};
21445 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21446 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21447 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21448 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21449
21450 VkCommandBuffer command_buffer[2];
21451 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21452 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21453 command_buffer_allocate_info.commandPool = command_pool;
21454 command_buffer_allocate_info.commandBufferCount = 2;
21455 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21456 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21457
21458 VkQueue queue = VK_NULL_HANDLE;
21459 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21460
21461 {
21462 VkCommandBufferBeginInfo begin_info{};
21463 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21464 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21465
21466 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 -070021467 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021468
21469 VkViewport viewport{};
21470 viewport.maxDepth = 1.0f;
21471 viewport.minDepth = 0.0f;
21472 viewport.width = 512;
21473 viewport.height = 512;
21474 viewport.x = 0;
21475 viewport.y = 0;
21476 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21477 vkEndCommandBuffer(command_buffer[0]);
21478 }
21479 {
21480 VkCommandBufferBeginInfo begin_info{};
21481 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21482 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21483
21484 VkViewport viewport{};
21485 viewport.maxDepth = 1.0f;
21486 viewport.minDepth = 0.0f;
21487 viewport.width = 512;
21488 viewport.height = 512;
21489 viewport.x = 0;
21490 viewport.y = 0;
21491 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21492 vkEndCommandBuffer(command_buffer[1]);
21493 }
21494 {
21495 VkSubmitInfo submit_info{};
21496 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21497 submit_info.commandBufferCount = 1;
21498 submit_info.pCommandBuffers = &command_buffer[0];
21499 submit_info.signalSemaphoreCount = 1;
21500 submit_info.pSignalSemaphores = &semaphore;
21501 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21502 }
21503 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021504 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021505 VkSubmitInfo submit_info{};
21506 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21507 submit_info.commandBufferCount = 1;
21508 submit_info.pCommandBuffers = &command_buffer[1];
21509 submit_info.waitSemaphoreCount = 1;
21510 submit_info.pWaitSemaphores = &semaphore;
21511 submit_info.pWaitDstStageMask = flags;
21512 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21513 }
21514
21515 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21516
21517 vkDestroyFence(m_device->device(), fence, nullptr);
21518 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21519 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21520 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21521
21522 m_errorMonitor->VerifyNotFound();
21523}
21524
21525// This is a positive test. No errors should be generated.
21526TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021527 TEST_DESCRIPTION(
21528 "Two command buffers, each in a separate QueueSubmit call "
21529 "on the same queue, sharing a signal/wait semaphore, the "
21530 "second having a fence, "
21531 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021532
21533 m_errorMonitor->ExpectSuccess();
21534
Tony Barbour1fa09702017-03-16 12:09:08 -060021535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021536 VkFence fence;
21537 VkFenceCreateInfo fence_create_info{};
21538 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21539 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21540
21541 VkSemaphore semaphore;
21542 VkSemaphoreCreateInfo semaphore_create_info{};
21543 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21544 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21545
21546 VkCommandPool command_pool;
21547 VkCommandPoolCreateInfo pool_create_info{};
21548 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21549 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21550 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21551 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21552
21553 VkCommandBuffer command_buffer[2];
21554 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21555 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21556 command_buffer_allocate_info.commandPool = command_pool;
21557 command_buffer_allocate_info.commandBufferCount = 2;
21558 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21559 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21560
21561 {
21562 VkCommandBufferBeginInfo begin_info{};
21563 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21564 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21565
21566 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 -070021567 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021568
21569 VkViewport viewport{};
21570 viewport.maxDepth = 1.0f;
21571 viewport.minDepth = 0.0f;
21572 viewport.width = 512;
21573 viewport.height = 512;
21574 viewport.x = 0;
21575 viewport.y = 0;
21576 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21577 vkEndCommandBuffer(command_buffer[0]);
21578 }
21579 {
21580 VkCommandBufferBeginInfo begin_info{};
21581 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21582 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21583
21584 VkViewport viewport{};
21585 viewport.maxDepth = 1.0f;
21586 viewport.minDepth = 0.0f;
21587 viewport.width = 512;
21588 viewport.height = 512;
21589 viewport.x = 0;
21590 viewport.y = 0;
21591 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21592 vkEndCommandBuffer(command_buffer[1]);
21593 }
21594 {
21595 VkSubmitInfo submit_info{};
21596 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21597 submit_info.commandBufferCount = 1;
21598 submit_info.pCommandBuffers = &command_buffer[0];
21599 submit_info.signalSemaphoreCount = 1;
21600 submit_info.pSignalSemaphores = &semaphore;
21601 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21602 }
21603 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021604 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021605 VkSubmitInfo submit_info{};
21606 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21607 submit_info.commandBufferCount = 1;
21608 submit_info.pCommandBuffers = &command_buffer[1];
21609 submit_info.waitSemaphoreCount = 1;
21610 submit_info.pWaitSemaphores = &semaphore;
21611 submit_info.pWaitDstStageMask = flags;
21612 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21613 }
21614
21615 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21616
21617 vkDestroyFence(m_device->device(), fence, nullptr);
21618 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21619 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21620 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21621
21622 m_errorMonitor->VerifyNotFound();
21623}
21624
21625// This is a positive test. No errors should be generated.
21626TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021627 TEST_DESCRIPTION(
21628 "Two command buffers, each in a separate QueueSubmit call "
21629 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21630 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021631
21632 m_errorMonitor->ExpectSuccess();
21633
Tony Barbour1fa09702017-03-16 12:09:08 -060021634 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021635 VkFence fence;
21636 VkFenceCreateInfo fence_create_info{};
21637 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21638 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21639
21640 VkCommandPool command_pool;
21641 VkCommandPoolCreateInfo pool_create_info{};
21642 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21643 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21644 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21645 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21646
21647 VkCommandBuffer command_buffer[2];
21648 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21649 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21650 command_buffer_allocate_info.commandPool = command_pool;
21651 command_buffer_allocate_info.commandBufferCount = 2;
21652 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21653 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21654
21655 {
21656 VkCommandBufferBeginInfo begin_info{};
21657 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21658 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21659
21660 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 -070021661 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021662
21663 VkViewport viewport{};
21664 viewport.maxDepth = 1.0f;
21665 viewport.minDepth = 0.0f;
21666 viewport.width = 512;
21667 viewport.height = 512;
21668 viewport.x = 0;
21669 viewport.y = 0;
21670 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21671 vkEndCommandBuffer(command_buffer[0]);
21672 }
21673 {
21674 VkCommandBufferBeginInfo begin_info{};
21675 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21676 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21677
21678 VkViewport viewport{};
21679 viewport.maxDepth = 1.0f;
21680 viewport.minDepth = 0.0f;
21681 viewport.width = 512;
21682 viewport.height = 512;
21683 viewport.x = 0;
21684 viewport.y = 0;
21685 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21686 vkEndCommandBuffer(command_buffer[1]);
21687 }
21688 {
21689 VkSubmitInfo submit_info{};
21690 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21691 submit_info.commandBufferCount = 1;
21692 submit_info.pCommandBuffers = &command_buffer[0];
21693 submit_info.signalSemaphoreCount = 0;
21694 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21695 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21696 }
21697 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021698 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021699 VkSubmitInfo submit_info{};
21700 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21701 submit_info.commandBufferCount = 1;
21702 submit_info.pCommandBuffers = &command_buffer[1];
21703 submit_info.waitSemaphoreCount = 0;
21704 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21705 submit_info.pWaitDstStageMask = flags;
21706 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21707 }
21708
21709 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21710
21711 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21712 ASSERT_VK_SUCCESS(err);
21713
21714 vkDestroyFence(m_device->device(), fence, nullptr);
21715 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21716 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21717
21718 m_errorMonitor->VerifyNotFound();
21719}
21720
21721// This is a positive test. No errors should be generated.
21722TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021723 TEST_DESCRIPTION(
21724 "Two command buffers, each in a separate QueueSubmit call "
21725 "on the same queue, the second having a fence, followed "
21726 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021727
21728 m_errorMonitor->ExpectSuccess();
21729
Tony Barbour1fa09702017-03-16 12:09:08 -060021730 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021731 VkFence fence;
21732 VkFenceCreateInfo fence_create_info{};
21733 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21734 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21735
21736 VkCommandPool command_pool;
21737 VkCommandPoolCreateInfo pool_create_info{};
21738 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21739 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21740 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21741 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21742
21743 VkCommandBuffer command_buffer[2];
21744 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21745 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21746 command_buffer_allocate_info.commandPool = command_pool;
21747 command_buffer_allocate_info.commandBufferCount = 2;
21748 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21749 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21750
21751 {
21752 VkCommandBufferBeginInfo begin_info{};
21753 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21754 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21755
21756 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 -070021757 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021758
21759 VkViewport viewport{};
21760 viewport.maxDepth = 1.0f;
21761 viewport.minDepth = 0.0f;
21762 viewport.width = 512;
21763 viewport.height = 512;
21764 viewport.x = 0;
21765 viewport.y = 0;
21766 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21767 vkEndCommandBuffer(command_buffer[0]);
21768 }
21769 {
21770 VkCommandBufferBeginInfo begin_info{};
21771 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21772 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21773
21774 VkViewport viewport{};
21775 viewport.maxDepth = 1.0f;
21776 viewport.minDepth = 0.0f;
21777 viewport.width = 512;
21778 viewport.height = 512;
21779 viewport.x = 0;
21780 viewport.y = 0;
21781 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21782 vkEndCommandBuffer(command_buffer[1]);
21783 }
21784 {
21785 VkSubmitInfo submit_info{};
21786 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21787 submit_info.commandBufferCount = 1;
21788 submit_info.pCommandBuffers = &command_buffer[0];
21789 submit_info.signalSemaphoreCount = 0;
21790 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21791 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21792 }
21793 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021794 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021795 VkSubmitInfo submit_info{};
21796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21797 submit_info.commandBufferCount = 1;
21798 submit_info.pCommandBuffers = &command_buffer[1];
21799 submit_info.waitSemaphoreCount = 0;
21800 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21801 submit_info.pWaitDstStageMask = flags;
21802 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21803 }
21804
21805 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21806
21807 vkDestroyFence(m_device->device(), fence, nullptr);
21808 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21809 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21810
21811 m_errorMonitor->VerifyNotFound();
21812}
21813
21814// This is a positive test. No errors should be generated.
21815TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021816 TEST_DESCRIPTION(
21817 "Two command buffers each in a separate SubmitInfo sent in a single "
21818 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021819 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021820
21821 m_errorMonitor->ExpectSuccess();
21822
21823 VkFence fence;
21824 VkFenceCreateInfo fence_create_info{};
21825 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21826 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21827
21828 VkSemaphore semaphore;
21829 VkSemaphoreCreateInfo semaphore_create_info{};
21830 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21831 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21832
21833 VkCommandPool command_pool;
21834 VkCommandPoolCreateInfo pool_create_info{};
21835 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21836 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21837 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21838 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21839
21840 VkCommandBuffer command_buffer[2];
21841 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21842 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21843 command_buffer_allocate_info.commandPool = command_pool;
21844 command_buffer_allocate_info.commandBufferCount = 2;
21845 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21846 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21847
21848 {
21849 VkCommandBufferBeginInfo begin_info{};
21850 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21851 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21852
21853 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 -070021854 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021855
21856 VkViewport viewport{};
21857 viewport.maxDepth = 1.0f;
21858 viewport.minDepth = 0.0f;
21859 viewport.width = 512;
21860 viewport.height = 512;
21861 viewport.x = 0;
21862 viewport.y = 0;
21863 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21864 vkEndCommandBuffer(command_buffer[0]);
21865 }
21866 {
21867 VkCommandBufferBeginInfo begin_info{};
21868 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21869 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21870
21871 VkViewport viewport{};
21872 viewport.maxDepth = 1.0f;
21873 viewport.minDepth = 0.0f;
21874 viewport.width = 512;
21875 viewport.height = 512;
21876 viewport.x = 0;
21877 viewport.y = 0;
21878 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21879 vkEndCommandBuffer(command_buffer[1]);
21880 }
21881 {
21882 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021883 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021884
21885 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21886 submit_info[0].pNext = NULL;
21887 submit_info[0].commandBufferCount = 1;
21888 submit_info[0].pCommandBuffers = &command_buffer[0];
21889 submit_info[0].signalSemaphoreCount = 1;
21890 submit_info[0].pSignalSemaphores = &semaphore;
21891 submit_info[0].waitSemaphoreCount = 0;
21892 submit_info[0].pWaitSemaphores = NULL;
21893 submit_info[0].pWaitDstStageMask = 0;
21894
21895 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21896 submit_info[1].pNext = NULL;
21897 submit_info[1].commandBufferCount = 1;
21898 submit_info[1].pCommandBuffers = &command_buffer[1];
21899 submit_info[1].waitSemaphoreCount = 1;
21900 submit_info[1].pWaitSemaphores = &semaphore;
21901 submit_info[1].pWaitDstStageMask = flags;
21902 submit_info[1].signalSemaphoreCount = 0;
21903 submit_info[1].pSignalSemaphores = NULL;
21904 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21905 }
21906
21907 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21908
21909 vkDestroyFence(m_device->device(), fence, nullptr);
21910 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21911 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21912 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21913
21914 m_errorMonitor->VerifyNotFound();
21915}
21916
21917TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21918 m_errorMonitor->ExpectSuccess();
21919
Tony Barbour1fa09702017-03-16 12:09:08 -060021920 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021921 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21922
Tony Barbour552f6c02016-12-21 14:34:07 -070021923 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021924
21925 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21926 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21927 m_errorMonitor->VerifyNotFound();
21928 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21929 m_errorMonitor->VerifyNotFound();
21930 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21931 m_errorMonitor->VerifyNotFound();
21932
21933 m_commandBuffer->EndCommandBuffer();
21934 m_errorMonitor->VerifyNotFound();
21935}
21936
21937TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021938 TEST_DESCRIPTION(
21939 "Positive test where we create a renderpass with an "
21940 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21941 "has a valid layout, and a second subpass then uses a "
21942 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021943 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021944 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021945 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021946 if (!depth_format) {
21947 printf(" No Depth + Stencil format found. Skipped.\n");
21948 return;
21949 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021950
21951 VkAttachmentReference attach[2] = {};
21952 attach[0].attachment = 0;
21953 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21954 attach[1].attachment = 0;
21955 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21956 VkSubpassDescription subpasses[2] = {};
21957 // First subpass clears DS attach on load
21958 subpasses[0].pDepthStencilAttachment = &attach[0];
21959 // 2nd subpass reads in DS as input attachment
21960 subpasses[1].inputAttachmentCount = 1;
21961 subpasses[1].pInputAttachments = &attach[1];
21962 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021963 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021964 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21965 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21966 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21967 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21968 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21969 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21970 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21971 VkRenderPassCreateInfo rpci = {};
21972 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21973 rpci.attachmentCount = 1;
21974 rpci.pAttachments = &attach_desc;
21975 rpci.subpassCount = 2;
21976 rpci.pSubpasses = subpasses;
21977
21978 // Now create RenderPass and verify no errors
21979 VkRenderPass rp;
21980 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21981 m_errorMonitor->VerifyNotFound();
21982
21983 vkDestroyRenderPass(m_device->device(), rp, NULL);
21984}
21985
Tobin Ehlis01103de2017-02-16 13:22:47 -070021986TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21987 TEST_DESCRIPTION(
21988 "Create a render pass with depth-stencil attachment where layout transition "
21989 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21990 "transition has correctly occurred at queue submit time with no validation errors.");
21991
Tony Barbour1fa09702017-03-16 12:09:08 -060021992 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021993 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021994 if (!depth_format) {
21995 printf(" No Depth + Stencil format found. Skipped.\n");
21996 return;
21997 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021998 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021999 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022000 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22001 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022002 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022003 return;
22004 }
22005
22006 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022007 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22008
22009 // A renderpass with one depth/stencil attachment.
22010 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022011 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022012 VK_SAMPLE_COUNT_1_BIT,
22013 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22014 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22015 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22016 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22017 VK_IMAGE_LAYOUT_UNDEFINED,
22018 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22019
22020 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22021
22022 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22023
22024 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22025
22026 VkRenderPass rp;
22027 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22028 ASSERT_VK_SUCCESS(err);
22029 // A compatible ds image.
22030 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022031 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 -070022032 ASSERT_TRUE(image.initialized());
22033
22034 VkImageViewCreateInfo ivci = {
22035 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22036 nullptr,
22037 0,
22038 image.handle(),
22039 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022040 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022041 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22042 VK_COMPONENT_SWIZZLE_IDENTITY},
22043 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22044 };
22045 VkImageView view;
22046 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22047 ASSERT_VK_SUCCESS(err);
22048
22049 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22050 VkFramebuffer fb;
22051 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22052 ASSERT_VK_SUCCESS(err);
22053
22054 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22055 m_commandBuffer->BeginCommandBuffer();
22056 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22057 vkCmdEndRenderPass(m_commandBuffer->handle());
22058 m_commandBuffer->EndCommandBuffer();
22059 QueueCommandBuffer(false);
22060 m_errorMonitor->VerifyNotFound();
22061
22062 // Cleanup
22063 vkDestroyImageView(m_device->device(), view, NULL);
22064 vkDestroyRenderPass(m_device->device(), rp, NULL);
22065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22066}
22067
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022068TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022069 TEST_DESCRIPTION(
22070 "Test that pipeline validation accepts matrices passed "
22071 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022072 m_errorMonitor->ExpectSuccess();
22073
Tony Barbour1fa09702017-03-16 12:09:08 -060022074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22076
22077 VkVertexInputBindingDescription input_binding;
22078 memset(&input_binding, 0, sizeof(input_binding));
22079
22080 VkVertexInputAttributeDescription input_attribs[2];
22081 memset(input_attribs, 0, sizeof(input_attribs));
22082
22083 for (int i = 0; i < 2; i++) {
22084 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22085 input_attribs[i].location = i;
22086 }
22087
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022088 char const *vsSource =
22089 "#version 450\n"
22090 "\n"
22091 "layout(location=0) in mat2x4 x;\n"
22092 "out gl_PerVertex {\n"
22093 " vec4 gl_Position;\n"
22094 "};\n"
22095 "void main(){\n"
22096 " gl_Position = x[0] + x[1];\n"
22097 "}\n";
22098 char const *fsSource =
22099 "#version 450\n"
22100 "\n"
22101 "layout(location=0) out vec4 color;\n"
22102 "void main(){\n"
22103 " color = vec4(1);\n"
22104 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022105
22106 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22107 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22108
22109 VkPipelineObj pipe(m_device);
22110 pipe.AddColorAttachment();
22111 pipe.AddShader(&vs);
22112 pipe.AddShader(&fs);
22113
22114 pipe.AddVertexInputBindings(&input_binding, 1);
22115 pipe.AddVertexInputAttribs(input_attribs, 2);
22116
22117 VkDescriptorSetObj descriptorSet(m_device);
22118 descriptorSet.AppendDummy();
22119 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22120
22121 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22122
22123 /* expect success */
22124 m_errorMonitor->VerifyNotFound();
22125}
22126
22127TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22128 m_errorMonitor->ExpectSuccess();
22129
Tony Barbour1fa09702017-03-16 12:09:08 -060022130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22132
22133 VkVertexInputBindingDescription input_binding;
22134 memset(&input_binding, 0, sizeof(input_binding));
22135
22136 VkVertexInputAttributeDescription input_attribs[2];
22137 memset(input_attribs, 0, sizeof(input_attribs));
22138
22139 for (int i = 0; i < 2; i++) {
22140 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22141 input_attribs[i].location = i;
22142 }
22143
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022144 char const *vsSource =
22145 "#version 450\n"
22146 "\n"
22147 "layout(location=0) in vec4 x[2];\n"
22148 "out gl_PerVertex {\n"
22149 " vec4 gl_Position;\n"
22150 "};\n"
22151 "void main(){\n"
22152 " gl_Position = x[0] + x[1];\n"
22153 "}\n";
22154 char const *fsSource =
22155 "#version 450\n"
22156 "\n"
22157 "layout(location=0) out vec4 color;\n"
22158 "void main(){\n"
22159 " color = vec4(1);\n"
22160 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022161
22162 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22163 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22164
22165 VkPipelineObj pipe(m_device);
22166 pipe.AddColorAttachment();
22167 pipe.AddShader(&vs);
22168 pipe.AddShader(&fs);
22169
22170 pipe.AddVertexInputBindings(&input_binding, 1);
22171 pipe.AddVertexInputAttribs(input_attribs, 2);
22172
22173 VkDescriptorSetObj descriptorSet(m_device);
22174 descriptorSet.AppendDummy();
22175 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22176
22177 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22178
22179 m_errorMonitor->VerifyNotFound();
22180}
22181
22182TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022183 TEST_DESCRIPTION(
22184 "Test that pipeline validation accepts consuming a vertex attribute "
22185 "through multiple vertex shader inputs, each consuming a different "
22186 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022187 m_errorMonitor->ExpectSuccess();
22188
Tony Barbour1fa09702017-03-16 12:09:08 -060022189 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22191
22192 VkVertexInputBindingDescription input_binding;
22193 memset(&input_binding, 0, sizeof(input_binding));
22194
22195 VkVertexInputAttributeDescription input_attribs[3];
22196 memset(input_attribs, 0, sizeof(input_attribs));
22197
22198 for (int i = 0; i < 3; i++) {
22199 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22200 input_attribs[i].location = i;
22201 }
22202
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022203 char const *vsSource =
22204 "#version 450\n"
22205 "\n"
22206 "layout(location=0) in vec4 x;\n"
22207 "layout(location=1) in vec3 y1;\n"
22208 "layout(location=1, component=3) in float y2;\n"
22209 "layout(location=2) in vec4 z;\n"
22210 "out gl_PerVertex {\n"
22211 " vec4 gl_Position;\n"
22212 "};\n"
22213 "void main(){\n"
22214 " gl_Position = x + vec4(y1, y2) + z;\n"
22215 "}\n";
22216 char const *fsSource =
22217 "#version 450\n"
22218 "\n"
22219 "layout(location=0) out vec4 color;\n"
22220 "void main(){\n"
22221 " color = vec4(1);\n"
22222 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022223
22224 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22225 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22226
22227 VkPipelineObj pipe(m_device);
22228 pipe.AddColorAttachment();
22229 pipe.AddShader(&vs);
22230 pipe.AddShader(&fs);
22231
22232 pipe.AddVertexInputBindings(&input_binding, 1);
22233 pipe.AddVertexInputAttribs(input_attribs, 3);
22234
22235 VkDescriptorSetObj descriptorSet(m_device);
22236 descriptorSet.AppendDummy();
22237 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22238
22239 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22240
22241 m_errorMonitor->VerifyNotFound();
22242}
22243
22244TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22245 m_errorMonitor->ExpectSuccess();
22246
Tony Barbour1fa09702017-03-16 12:09:08 -060022247 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22249
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022250 char const *vsSource =
22251 "#version 450\n"
22252 "out gl_PerVertex {\n"
22253 " vec4 gl_Position;\n"
22254 "};\n"
22255 "void main(){\n"
22256 " gl_Position = vec4(0);\n"
22257 "}\n";
22258 char const *fsSource =
22259 "#version 450\n"
22260 "\n"
22261 "layout(location=0) out vec4 color;\n"
22262 "void main(){\n"
22263 " color = vec4(1);\n"
22264 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022265
22266 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22267 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22268
22269 VkPipelineObj pipe(m_device);
22270 pipe.AddColorAttachment();
22271 pipe.AddShader(&vs);
22272 pipe.AddShader(&fs);
22273
22274 VkDescriptorSetObj descriptorSet(m_device);
22275 descriptorSet.AppendDummy();
22276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22277
22278 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22279
22280 m_errorMonitor->VerifyNotFound();
22281}
22282
22283TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022284 TEST_DESCRIPTION(
22285 "Test that pipeline validation accepts the relaxed type matching rules "
22286 "set out in 14.1.3: fundamental type must match, and producer side must "
22287 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022288 m_errorMonitor->ExpectSuccess();
22289
22290 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22291
Tony Barbour1fa09702017-03-16 12:09:08 -060022292 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022295 char const *vsSource =
22296 "#version 450\n"
22297 "out gl_PerVertex {\n"
22298 " vec4 gl_Position;\n"
22299 "};\n"
22300 "layout(location=0) out vec3 x;\n"
22301 "layout(location=1) out ivec3 y;\n"
22302 "layout(location=2) out vec3 z;\n"
22303 "void main(){\n"
22304 " gl_Position = vec4(0);\n"
22305 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22306 "}\n";
22307 char const *fsSource =
22308 "#version 450\n"
22309 "\n"
22310 "layout(location=0) out vec4 color;\n"
22311 "layout(location=0) in float x;\n"
22312 "layout(location=1) flat in int y;\n"
22313 "layout(location=2) in vec2 z;\n"
22314 "void main(){\n"
22315 " color = vec4(1 + x + y + z.x);\n"
22316 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022317
22318 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22320
22321 VkPipelineObj pipe(m_device);
22322 pipe.AddColorAttachment();
22323 pipe.AddShader(&vs);
22324 pipe.AddShader(&fs);
22325
22326 VkDescriptorSetObj descriptorSet(m_device);
22327 descriptorSet.AppendDummy();
22328 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22329
22330 VkResult err = VK_SUCCESS;
22331 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22332 ASSERT_VK_SUCCESS(err);
22333
22334 m_errorMonitor->VerifyNotFound();
22335}
22336
22337TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022338 TEST_DESCRIPTION(
22339 "Test that pipeline validation accepts per-vertex variables "
22340 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022341 m_errorMonitor->ExpectSuccess();
22342
Tony Barbour1fa09702017-03-16 12:09:08 -060022343 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22345
22346 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022347 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022348 return;
22349 }
22350
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022351 char const *vsSource =
22352 "#version 450\n"
22353 "void main(){}\n";
22354 char const *tcsSource =
22355 "#version 450\n"
22356 "layout(location=0) out int x[];\n"
22357 "layout(vertices=3) out;\n"
22358 "void main(){\n"
22359 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22360 " gl_TessLevelInner[0] = 1;\n"
22361 " x[gl_InvocationID] = gl_InvocationID;\n"
22362 "}\n";
22363 char const *tesSource =
22364 "#version 450\n"
22365 "layout(triangles, equal_spacing, cw) in;\n"
22366 "layout(location=0) in int x[];\n"
22367 "out gl_PerVertex { vec4 gl_Position; };\n"
22368 "void main(){\n"
22369 " gl_Position.xyz = gl_TessCoord;\n"
22370 " gl_Position.w = x[0] + x[1] + x[2];\n"
22371 "}\n";
22372 char const *fsSource =
22373 "#version 450\n"
22374 "layout(location=0) out vec4 color;\n"
22375 "void main(){\n"
22376 " color = vec4(1);\n"
22377 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022378
22379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22380 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22381 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22383
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022384 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22385 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022386
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022387 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022388
22389 VkPipelineObj pipe(m_device);
22390 pipe.SetInputAssembly(&iasci);
22391 pipe.SetTessellation(&tsci);
22392 pipe.AddColorAttachment();
22393 pipe.AddShader(&vs);
22394 pipe.AddShader(&tcs);
22395 pipe.AddShader(&tes);
22396 pipe.AddShader(&fs);
22397
22398 VkDescriptorSetObj descriptorSet(m_device);
22399 descriptorSet.AppendDummy();
22400 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22401
22402 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22403
22404 m_errorMonitor->VerifyNotFound();
22405}
22406
22407TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022408 TEST_DESCRIPTION(
22409 "Test that pipeline validation accepts a user-defined "
22410 "interface block passed into the geometry shader. This "
22411 "is interesting because the 'extra' array level is not "
22412 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022413 m_errorMonitor->ExpectSuccess();
22414
Tony Barbour1fa09702017-03-16 12:09:08 -060022415 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22417
22418 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022419 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022420 return;
22421 }
22422
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022423 char const *vsSource =
22424 "#version 450\n"
22425 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22426 "void main(){\n"
22427 " vs_out.x = vec4(1);\n"
22428 "}\n";
22429 char const *gsSource =
22430 "#version 450\n"
22431 "layout(triangles) in;\n"
22432 "layout(triangle_strip, max_vertices=3) out;\n"
22433 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22434 "out gl_PerVertex { vec4 gl_Position; };\n"
22435 "void main() {\n"
22436 " gl_Position = gs_in[0].x;\n"
22437 " EmitVertex();\n"
22438 "}\n";
22439 char const *fsSource =
22440 "#version 450\n"
22441 "layout(location=0) out vec4 color;\n"
22442 "void main(){\n"
22443 " color = vec4(1);\n"
22444 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022445
22446 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22447 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22448 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22449
22450 VkPipelineObj pipe(m_device);
22451 pipe.AddColorAttachment();
22452 pipe.AddShader(&vs);
22453 pipe.AddShader(&gs);
22454 pipe.AddShader(&fs);
22455
22456 VkDescriptorSetObj descriptorSet(m_device);
22457 descriptorSet.AppendDummy();
22458 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22459
22460 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22461
22462 m_errorMonitor->VerifyNotFound();
22463}
22464
22465TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022466 TEST_DESCRIPTION(
22467 "Test that pipeline validation accepts basic use of 64bit vertex "
22468 "attributes. This is interesting because they consume multiple "
22469 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022470 m_errorMonitor->ExpectSuccess();
22471
Tony Barbour1fa09702017-03-16 12:09:08 -060022472 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22474
22475 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022476 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022477 return;
22478 }
22479
22480 VkVertexInputBindingDescription input_bindings[1];
22481 memset(input_bindings, 0, sizeof(input_bindings));
22482
22483 VkVertexInputAttributeDescription input_attribs[4];
22484 memset(input_attribs, 0, sizeof(input_attribs));
22485 input_attribs[0].location = 0;
22486 input_attribs[0].offset = 0;
22487 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22488 input_attribs[1].location = 2;
22489 input_attribs[1].offset = 32;
22490 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22491 input_attribs[2].location = 4;
22492 input_attribs[2].offset = 64;
22493 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22494 input_attribs[3].location = 6;
22495 input_attribs[3].offset = 96;
22496 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22497
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022498 char const *vsSource =
22499 "#version 450\n"
22500 "\n"
22501 "layout(location=0) in dmat4 x;\n"
22502 "out gl_PerVertex {\n"
22503 " vec4 gl_Position;\n"
22504 "};\n"
22505 "void main(){\n"
22506 " gl_Position = vec4(x[0][0]);\n"
22507 "}\n";
22508 char const *fsSource =
22509 "#version 450\n"
22510 "\n"
22511 "layout(location=0) out vec4 color;\n"
22512 "void main(){\n"
22513 " color = vec4(1);\n"
22514 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022515
22516 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22518
22519 VkPipelineObj pipe(m_device);
22520 pipe.AddColorAttachment();
22521 pipe.AddShader(&vs);
22522 pipe.AddShader(&fs);
22523
22524 pipe.AddVertexInputBindings(input_bindings, 1);
22525 pipe.AddVertexInputAttribs(input_attribs, 4);
22526
22527 VkDescriptorSetObj descriptorSet(m_device);
22528 descriptorSet.AppendDummy();
22529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22530
22531 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22532
22533 m_errorMonitor->VerifyNotFound();
22534}
22535
22536TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22537 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22538 m_errorMonitor->ExpectSuccess();
22539
Tony Barbour1fa09702017-03-16 12:09:08 -060022540 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022541
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022542 char const *vsSource =
22543 "#version 450\n"
22544 "\n"
22545 "out gl_PerVertex {\n"
22546 " vec4 gl_Position;\n"
22547 "};\n"
22548 "void main(){\n"
22549 " gl_Position = vec4(1);\n"
22550 "}\n";
22551 char const *fsSource =
22552 "#version 450\n"
22553 "\n"
22554 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22555 "layout(location=0) out vec4 color;\n"
22556 "void main() {\n"
22557 " color = subpassLoad(x);\n"
22558 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559
22560 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22561 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22562
22563 VkPipelineObj pipe(m_device);
22564 pipe.AddShader(&vs);
22565 pipe.AddShader(&fs);
22566 pipe.AddColorAttachment();
22567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22568
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022569 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22570 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022571 VkDescriptorSetLayout dsl;
22572 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22573 ASSERT_VK_SUCCESS(err);
22574
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022575 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022576 VkPipelineLayout pl;
22577 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22578 ASSERT_VK_SUCCESS(err);
22579
22580 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022581 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22582 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22583 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22584 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22585 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 -060022586 };
22587 VkAttachmentReference color = {
22588 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22589 };
22590 VkAttachmentReference input = {
22591 1, VK_IMAGE_LAYOUT_GENERAL,
22592 };
22593
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022594 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022595
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022596 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022597 VkRenderPass rp;
22598 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22599 ASSERT_VK_SUCCESS(err);
22600
22601 // should be OK. would go wrong here if it's going to...
22602 pipe.CreateVKPipeline(pl, rp);
22603
22604 m_errorMonitor->VerifyNotFound();
22605
22606 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22607 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22608 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22609}
22610
22611TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022612 TEST_DESCRIPTION(
22613 "Test that pipeline validation accepts a compute pipeline which declares a "
22614 "descriptor-backed resource which is not provided, but the shader does not "
22615 "statically use it. This is interesting because it requires compute pipelines "
22616 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022617 m_errorMonitor->ExpectSuccess();
22618
Tony Barbour1fa09702017-03-16 12:09:08 -060022619 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022620
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022621 char const *csSource =
22622 "#version 450\n"
22623 "\n"
22624 "layout(local_size_x=1) in;\n"
22625 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22626 "void main(){\n"
22627 " // x is not used.\n"
22628 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022629
22630 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22631
22632 VkDescriptorSetObj descriptorSet(m_device);
22633 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22634
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022635 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22636 nullptr,
22637 0,
22638 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22639 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22640 descriptorSet.GetPipelineLayout(),
22641 VK_NULL_HANDLE,
22642 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022643
22644 VkPipeline pipe;
22645 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22646
22647 m_errorMonitor->VerifyNotFound();
22648
22649 if (err == VK_SUCCESS) {
22650 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22651 }
22652}
22653
22654TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022655 TEST_DESCRIPTION(
22656 "Test that pipeline validation accepts a shader consuming only the "
22657 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022658 m_errorMonitor->ExpectSuccess();
22659
Tony Barbour1fa09702017-03-16 12:09:08 -060022660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022661
22662 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022663 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22664 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22665 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022666 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022667 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022668 VkDescriptorSetLayout dsl;
22669 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22670 ASSERT_VK_SUCCESS(err);
22671
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022672 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022673 VkPipelineLayout pl;
22674 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22675 ASSERT_VK_SUCCESS(err);
22676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022677 char const *csSource =
22678 "#version 450\n"
22679 "\n"
22680 "layout(local_size_x=1) in;\n"
22681 "layout(set=0, binding=0) uniform sampler s;\n"
22682 "layout(set=0, binding=1) uniform texture2D t;\n"
22683 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22684 "void main() {\n"
22685 " x = texture(sampler2D(t, s), vec2(0));\n"
22686 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022687 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22688
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022689 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22690 nullptr,
22691 0,
22692 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22693 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22694 pl,
22695 VK_NULL_HANDLE,
22696 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022697
22698 VkPipeline pipe;
22699 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22700
22701 m_errorMonitor->VerifyNotFound();
22702
22703 if (err == VK_SUCCESS) {
22704 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22705 }
22706
22707 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22708 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22709}
22710
22711TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022712 TEST_DESCRIPTION(
22713 "Test that pipeline validation accepts a shader consuming only the "
22714 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022715 m_errorMonitor->ExpectSuccess();
22716
Tony Barbour1fa09702017-03-16 12:09:08 -060022717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022718
22719 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022720 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22721 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22722 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022723 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022724 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022725 VkDescriptorSetLayout dsl;
22726 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22727 ASSERT_VK_SUCCESS(err);
22728
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022729 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022730 VkPipelineLayout pl;
22731 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22732 ASSERT_VK_SUCCESS(err);
22733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022734 char const *csSource =
22735 "#version 450\n"
22736 "\n"
22737 "layout(local_size_x=1) in;\n"
22738 "layout(set=0, binding=0) uniform texture2D t;\n"
22739 "layout(set=0, binding=1) uniform sampler s;\n"
22740 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22741 "void main() {\n"
22742 " x = texture(sampler2D(t, s), vec2(0));\n"
22743 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022744 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22745
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022746 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22747 nullptr,
22748 0,
22749 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22750 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22751 pl,
22752 VK_NULL_HANDLE,
22753 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022754
22755 VkPipeline pipe;
22756 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22757
22758 m_errorMonitor->VerifyNotFound();
22759
22760 if (err == VK_SUCCESS) {
22761 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22762 }
22763
22764 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22765 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22766}
22767
22768TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022769 TEST_DESCRIPTION(
22770 "Test that pipeline validation accepts a shader consuming "
22771 "both the sampler and the image of a combined image+sampler "
22772 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022773 m_errorMonitor->ExpectSuccess();
22774
Tony Barbour1fa09702017-03-16 12:09:08 -060022775 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022776
22777 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022778 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22779 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022780 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022781 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022782 VkDescriptorSetLayout dsl;
22783 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22784 ASSERT_VK_SUCCESS(err);
22785
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022786 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022787 VkPipelineLayout pl;
22788 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22789 ASSERT_VK_SUCCESS(err);
22790
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022791 char const *csSource =
22792 "#version 450\n"
22793 "\n"
22794 "layout(local_size_x=1) in;\n"
22795 "layout(set=0, binding=0) uniform texture2D t;\n"
22796 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22797 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22798 "void main() {\n"
22799 " x = texture(sampler2D(t, s), vec2(0));\n"
22800 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022801 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22802
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022803 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22804 nullptr,
22805 0,
22806 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22807 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22808 pl,
22809 VK_NULL_HANDLE,
22810 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022811
22812 VkPipeline pipe;
22813 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22814
22815 m_errorMonitor->VerifyNotFound();
22816
22817 if (err == VK_SUCCESS) {
22818 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22819 }
22820
22821 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22822 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22823}
22824
Tony Barbour3ed87a02017-03-15 16:19:02 -060022825TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022826 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22827
Tony Barbour3ed87a02017-03-15 16:19:02 -060022828 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022829 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022830
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022831 // Ensure that extension is available and enabled.
22832 uint32_t extension_count = 0;
22833 bool supports_maintenance1_extension = false;
22834 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22835 ASSERT_VK_SUCCESS(err);
22836 if (extension_count > 0) {
22837 std::vector<VkExtensionProperties> available_extensions(extension_count);
22838
22839 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22840 ASSERT_VK_SUCCESS(err);
22841 for (const auto &extension_props : available_extensions) {
22842 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22843 supports_maintenance1_extension = true;
22844 }
22845 }
22846 }
22847
22848 // Proceed if extension is supported by hardware
22849 if (!supports_maintenance1_extension) {
22850 printf(" Maintenance1 Extension not supported, skipping tests\n");
22851 return;
22852 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022853
22854 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060022855 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022856 VkCommandBuffer cmd_buf;
22857 VkCommandBufferAllocateInfo alloc_info;
22858 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22859 alloc_info.pNext = NULL;
22860 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022861 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022862 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22863 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22864
22865 VkCommandBufferBeginInfo cb_binfo;
22866 cb_binfo.pNext = NULL;
22867 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22868 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22869 cb_binfo.flags = 0;
22870 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22871 // Set Negative height, should give error if Maintenance 1 is not enabled
22872 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22873 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22874 vkEndCommandBuffer(cmd_buf);
22875
22876 m_errorMonitor->VerifyNotFound();
22877}
22878
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022879TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22880 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22881
22882 ASSERT_NO_FATAL_FAILURE(Init());
22883
22884 uint32_t extension_count = 0;
22885 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22886 ASSERT_VK_SUCCESS(err);
22887
22888 if (extension_count > 0) {
22889 std::vector<VkExtensionProperties> available_extensions(extension_count);
22890 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22891 ASSERT_VK_SUCCESS(err);
22892
22893 for (const auto &extension_props : available_extensions) {
22894 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22895 // Create two pNext structures which by themselves would be valid
22896 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22897 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22898 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22899 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22900 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22901
22902 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22903 dedicated_buffer_create_info_2.pNext = nullptr;
22904 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22905
22906 uint32_t queue_family_index = 0;
22907 VkBufferCreateInfo buffer_create_info = {};
22908 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22909 buffer_create_info.pNext = &dedicated_buffer_create_info;
22910 buffer_create_info.size = 1024;
22911 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22912 buffer_create_info.queueFamilyIndexCount = 1;
22913 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22914
22915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22916 VkBuffer buffer;
22917 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22918 m_errorMonitor->VerifyFound();
22919 }
22920 }
22921 }
22922}
22923
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022924TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22925 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22926
Tony Barbour1fa09702017-03-16 12:09:08 -060022927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928
22929 // Positive test to check parameter_validation and unique_objects support
22930 // for NV_dedicated_allocation
22931 uint32_t extension_count = 0;
22932 bool supports_nv_dedicated_allocation = false;
22933 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22934 ASSERT_VK_SUCCESS(err);
22935
22936 if (extension_count > 0) {
22937 std::vector<VkExtensionProperties> available_extensions(extension_count);
22938
22939 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22940 ASSERT_VK_SUCCESS(err);
22941
22942 for (const auto &extension_props : available_extensions) {
22943 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22944 supports_nv_dedicated_allocation = true;
22945 }
22946 }
22947 }
22948
22949 if (supports_nv_dedicated_allocation) {
22950 m_errorMonitor->ExpectSuccess();
22951
22952 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22953 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22954 dedicated_buffer_create_info.pNext = nullptr;
22955 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22956
22957 uint32_t queue_family_index = 0;
22958 VkBufferCreateInfo buffer_create_info = {};
22959 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22960 buffer_create_info.pNext = &dedicated_buffer_create_info;
22961 buffer_create_info.size = 1024;
22962 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22963 buffer_create_info.queueFamilyIndexCount = 1;
22964 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22965
22966 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022967 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022968 ASSERT_VK_SUCCESS(err);
22969
22970 VkMemoryRequirements memory_reqs;
22971 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22972
22973 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22974 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22975 dedicated_memory_info.pNext = nullptr;
22976 dedicated_memory_info.buffer = buffer;
22977 dedicated_memory_info.image = VK_NULL_HANDLE;
22978
22979 VkMemoryAllocateInfo memory_info = {};
22980 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22981 memory_info.pNext = &dedicated_memory_info;
22982 memory_info.allocationSize = memory_reqs.size;
22983
22984 bool pass;
22985 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22986 ASSERT_TRUE(pass);
22987
22988 VkDeviceMemory buffer_memory;
22989 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22990 ASSERT_VK_SUCCESS(err);
22991
22992 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22993 ASSERT_VK_SUCCESS(err);
22994
22995 vkDestroyBuffer(m_device->device(), buffer, NULL);
22996 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22997
22998 m_errorMonitor->VerifyNotFound();
22999 }
23000}
23001
23002TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23003 VkResult err;
23004
23005 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23006
Tony Barbour1fa09702017-03-16 12:09:08 -060023007 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23009
23010 std::vector<const char *> device_extension_names;
23011 auto features = m_device->phy().features();
23012 // Artificially disable support for non-solid fill modes
23013 features.fillModeNonSolid = false;
23014 // The sacrificial device object
23015 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23016
23017 VkRenderpassObj render_pass(&test_device);
23018
23019 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23020 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23021 pipeline_layout_ci.setLayoutCount = 0;
23022 pipeline_layout_ci.pSetLayouts = NULL;
23023
23024 VkPipelineLayout pipeline_layout;
23025 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23026 ASSERT_VK_SUCCESS(err);
23027
23028 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23029 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23030 rs_ci.pNext = nullptr;
23031 rs_ci.lineWidth = 1.0f;
23032 rs_ci.rasterizerDiscardEnable = true;
23033
23034 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23035 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23036
23037 // Set polygonMode=FILL. No error is expected
23038 m_errorMonitor->ExpectSuccess();
23039 {
23040 VkPipelineObj pipe(&test_device);
23041 pipe.AddShader(&vs);
23042 pipe.AddShader(&fs);
23043 pipe.AddColorAttachment();
23044 // Set polygonMode to a good value
23045 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23046 pipe.SetRasterization(&rs_ci);
23047 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23048 }
23049 m_errorMonitor->VerifyNotFound();
23050
23051 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23052}
23053
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023054#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023055TEST_F(VkPositiveLayerTest, LongFenceChain)
23056{
23057 m_errorMonitor->ExpectSuccess();
23058
Tony Barbour1fa09702017-03-16 12:09:08 -060023059 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023060 VkResult err;
23061
23062 std::vector<VkFence> fences;
23063
23064 const int chainLength = 32768;
23065
23066 for (int i = 0; i < chainLength; i++) {
23067 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23068 VkFence fence;
23069 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23070 ASSERT_VK_SUCCESS(err);
23071
23072 fences.push_back(fence);
23073
23074 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23075 0, nullptr, 0, nullptr };
23076 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23077 ASSERT_VK_SUCCESS(err);
23078
23079 }
23080
23081 // BOOM, stack overflow.
23082 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23083
23084 for (auto fence : fences)
23085 vkDestroyFence(m_device->device(), fence, nullptr);
23086
23087 m_errorMonitor->VerifyNotFound();
23088}
23089#endif
23090
Cody Northrop1242dfd2016-07-13 17:24:59 -060023091#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023092const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023093static bool initialized = false;
23094static bool active = false;
23095
23096// Convert Intents to argv
23097// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023098std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023099 std::vector<std::string> args;
23100 JavaVM &vm = *app.activity->vm;
23101 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023102 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023103
23104 JNIEnv &env = *p_env;
23105 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023106 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023107 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 jmethodID get_string_extra_method =
23109 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023110 jvalue get_string_extra_args;
23111 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023112 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023113
23114 std::string args_str;
23115 if (extra_str) {
23116 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23117 args_str = extra_utf;
23118 env.ReleaseStringUTFChars(extra_str, extra_utf);
23119 env.DeleteLocalRef(extra_str);
23120 }
23121
23122 env.DeleteLocalRef(get_string_extra_args.l);
23123 env.DeleteLocalRef(intent);
23124 vm.DetachCurrentThread();
23125
23126 // split args_str
23127 std::stringstream ss(args_str);
23128 std::string arg;
23129 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023130 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023131 }
23132
23133 return args;
23134}
23135
Cody Northropb94529f2017-04-05 13:05:51 -060023136void addFullTestCommentIfPresent(const ::testing::TestInfo& test_info, std::string& error_message) {
23137 const char* const type_param = test_info.type_param();
23138 const char* const value_param = test_info.value_param();
23139
23140 if (type_param != NULL || value_param != NULL) {
23141 error_message.append(", where ");
23142 if (type_param != NULL) {
23143 error_message.append("TypeParam = ").append(type_param);
23144 if (value_param != NULL)
23145 error_message.append(" and ");
23146 }
23147 if (value_param != NULL) {
23148 error_message.append("GetParam() = ").append(value_param);
23149 }
23150 }
23151}
23152
23153// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23154class LogcatPrinter : public ::testing::EmptyTestEventListener {
23155 // Called before a test starts.
23156 virtual void OnTestStart(const ::testing::TestInfo& test_info) {
23157 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23158 }
23159
23160 // Called after a failed assertion or a SUCCEED() invocation.
23161 virtual void OnTestPartResult(const ::testing::TestPartResult& result) {
23162
23163 // If the test part succeeded, we don't need to do anything.
23164 if (result.type() == ::testing::TestPartResult::kSuccess)
23165 return;
23166
23167 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s",
23168 result.failed() ? "*** Failure" : "Success",
23169 result.file_name(),
23170 result.line_number(),
23171 result.summary());
23172 }
23173
23174 // Called after a test ends.
23175 virtual void OnTestEnd(const ::testing::TestInfo& info) {
23176 std::string result;
23177 if (info.result()->Passed()) {
23178 result.append("[ OK ]");
23179 } else {
23180 result.append("[ FAILED ]");
23181 }
23182 result.append(info.test_case_name()).append(".").append(info.name());
23183 if (info.result()->Failed())
23184 addFullTestCommentIfPresent(info, result);
23185
23186 if (::testing::GTEST_FLAG(print_time)) {
23187 std::ostringstream os;
23188 os << info.result()->elapsed_time();
23189 result.append(" (").append(os.str()).append(" ms)");
23190 }
23191
23192 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23193 };
23194};
23195
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023196static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023198static void processCommand(struct android_app *app, int32_t cmd) {
23199 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023200 case APP_CMD_INIT_WINDOW: {
23201 if (app->window) {
23202 initialized = true;
23203 }
23204 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023205 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023206 case APP_CMD_GAINED_FOCUS: {
23207 active = true;
23208 break;
23209 }
23210 case APP_CMD_LOST_FOCUS: {
23211 active = false;
23212 break;
23213 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023214 }
23215}
23216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023217void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023218 app_dummy();
23219
Cody Northrop1242dfd2016-07-13 17:24:59 -060023220
23221 int vulkanSupport = InitVulkan();
23222 if (vulkanSupport == 0) {
23223 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23224 return;
23225 }
23226
23227 app->onAppCmd = processCommand;
23228 app->onInputEvent = processInput;
23229
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023230 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023231 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023232 struct android_poll_source *source;
23233 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023234 if (source) {
23235 source->process(app, source);
23236 }
23237
23238 if (app->destroyRequested != 0) {
23239 VkTestFramework::Finish();
23240 return;
23241 }
23242 }
23243
23244 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023245 // Use the following key to send arguments to gtest, i.e.
23246 // --es args "--gtest_filter=-VkLayerTest.foo"
23247 const char key[] = "args";
23248 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023249
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023250 std::string filter = "";
23251 if (args.size() > 0) {
23252 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23253 filter += args[0];
23254 } else {
23255 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23256 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023258 int argc = 2;
23259 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23260 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023262 // Route output to files until we can override the gtest output
23263 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23264 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023265
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023266 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023267
23268 ::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
23269 listeners.Append(new LogcatPrinter);
23270
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023271 VkTestFramework::InitArgs(&argc, argv);
23272 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023273
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023274 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023276 if (result != 0) {
23277 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23278 } else {
23279 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23280 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023282 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023283
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023284 fclose(stdout);
23285 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023287 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023288 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023289 }
23290 }
23291}
23292#endif
23293
Tony Barbour300a6082015-04-07 13:44:53 -060023294int main(int argc, char **argv) {
23295 int result;
23296
Cody Northrop8e54a402016-03-08 22:25:52 -070023297#ifdef ANDROID
23298 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023299 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023300#endif
23301
Tony Barbour300a6082015-04-07 13:44:53 -060023302 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023303 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023304
23305 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23306
23307 result = RUN_ALL_TESTS();
23308
Tony Barbour6918cd52015-04-09 12:58:51 -060023309 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023310 return result;
23311}