blob: 99e184f1fd30a1c34163322f74b1f2e1552849de [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) {
105 VkFormat ds_formats[] = { VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT };
106 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");
Dave Houlton3c9fca72017-03-27 17:25:54 -06001364 ASSERT_NO_FATAL_FAILURE(
1365 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001366
1367 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001368 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001369 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1370
1371 // Mask out device features we don't want
1372 VkPhysicalDeviceFeatures desired_features = available_features;
1373 desired_features.sparseResidencyImage2D = VK_FALSE;
1374 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001375 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
1377 VkImage image = VK_NULL_HANDLE;
1378 VkResult result = VK_RESULT_MAX_ENUM;
1379 VkImageCreateInfo image_create_info = {};
1380 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1381 image_create_info.pNext = NULL;
1382 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1383 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1384 image_create_info.extent.width = 512;
1385 image_create_info.extent.height = 1;
1386 image_create_info.extent.depth = 1;
1387 image_create_info.mipLevels = 1;
1388 image_create_info.arrayLayers = 1;
1389 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1390 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1391 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1392 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1393 image_create_info.queueFamilyIndexCount = 0;
1394 image_create_info.pQueueFamilyIndices = NULL;
1395 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1396 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1397
1398 // 1D image w/ sparse residency is an error
1399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1400 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1401 m_errorMonitor->VerifyFound();
1402 if (VK_SUCCESS == result) {
1403 vkDestroyImage(m_device->device(), image, NULL);
1404 image = VK_NULL_HANDLE;
1405 }
1406
1407 // 2D image w/ sparse residency when feature isn't available
1408 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1409 image_create_info.extent.height = 64;
1410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1411 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1412 m_errorMonitor->VerifyFound();
1413 if (VK_SUCCESS == result) {
1414 vkDestroyImage(m_device->device(), image, NULL);
1415 image = VK_NULL_HANDLE;
1416 }
1417
1418 // 3D image w/ sparse residency when feature isn't available
1419 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1420 image_create_info.extent.depth = 8;
1421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1422 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1423 m_errorMonitor->VerifyFound();
1424 if (VK_SUCCESS == result) {
1425 vkDestroyImage(m_device->device(), image, NULL);
1426 image = VK_NULL_HANDLE;
1427 }
1428}
1429
1430TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1431 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Dave Houlton3c9fca72017-03-27 17:25:54 -06001432 ASSERT_NO_FATAL_FAILURE(
1433 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001436 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001437 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1438
1439 // These tests all require that the device support sparse residency for 2D images
1440 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1441 return;
1442 }
1443
1444 // Mask out device features we don't want
1445 VkPhysicalDeviceFeatures desired_features = available_features;
1446 desired_features.sparseResidency2Samples = VK_FALSE;
1447 desired_features.sparseResidency4Samples = VK_FALSE;
1448 desired_features.sparseResidency8Samples = VK_FALSE;
1449 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001450 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001451
1452 VkImage image = VK_NULL_HANDLE;
1453 VkResult result = VK_RESULT_MAX_ENUM;
1454 VkImageCreateInfo image_create_info = {};
1455 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1456 image_create_info.pNext = NULL;
1457 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1458 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1459 image_create_info.extent.width = 64;
1460 image_create_info.extent.height = 64;
1461 image_create_info.extent.depth = 1;
1462 image_create_info.mipLevels = 1;
1463 image_create_info.arrayLayers = 1;
1464 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1465 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1466 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1467 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1468 image_create_info.queueFamilyIndexCount = 0;
1469 image_create_info.pQueueFamilyIndices = NULL;
1470 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1471 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1472
1473 // 2D image w/ sparse residency and linear tiling is an error
1474 m_errorMonitor->SetDesiredFailureMsg(
1475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1476 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1477 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1478 m_errorMonitor->VerifyFound();
1479 if (VK_SUCCESS == result) {
1480 vkDestroyImage(m_device->device(), image, NULL);
1481 image = VK_NULL_HANDLE;
1482 }
1483 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1484
1485 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1486 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1488 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1489 m_errorMonitor->VerifyFound();
1490 if (VK_SUCCESS == result) {
1491 vkDestroyImage(m_device->device(), image, NULL);
1492 image = VK_NULL_HANDLE;
1493 }
1494
1495 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1497 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1498 m_errorMonitor->VerifyFound();
1499 if (VK_SUCCESS == result) {
1500 vkDestroyImage(m_device->device(), image, NULL);
1501 image = VK_NULL_HANDLE;
1502 }
1503
1504 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1506 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1507 m_errorMonitor->VerifyFound();
1508 if (VK_SUCCESS == result) {
1509 vkDestroyImage(m_device->device(), image, NULL);
1510 image = VK_NULL_HANDLE;
1511 }
1512
1513 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1515 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1516 m_errorMonitor->VerifyFound();
1517 if (VK_SUCCESS == result) {
1518 vkDestroyImage(m_device->device(), image, NULL);
1519 image = VK_NULL_HANDLE;
1520 }
1521}
1522
Tobin Ehlisf11be982016-05-11 13:52:53 -06001523TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001524 TEST_DESCRIPTION(
1525 "Create a buffer and image, allocate memory, and bind the "
1526 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001527 VkResult err;
1528 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001529 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001530
Tobin Ehlis077ded32016-05-12 17:39:13 -06001531 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001533 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001534 VkDeviceMemory mem; // buffer will be bound first
1535 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001537 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001538
1539 VkBufferCreateInfo buf_info = {};
1540 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1541 buf_info.pNext = NULL;
1542 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1543 buf_info.size = 256;
1544 buf_info.queueFamilyIndexCount = 0;
1545 buf_info.pQueueFamilyIndices = NULL;
1546 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1547 buf_info.flags = 0;
1548 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1549 ASSERT_VK_SUCCESS(err);
1550
Tobin Ehlis077ded32016-05-12 17:39:13 -06001551 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001552
1553 VkImageCreateInfo image_create_info = {};
1554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1555 image_create_info.pNext = NULL;
1556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1557 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1558 image_create_info.extent.width = 64;
1559 image_create_info.extent.height = 64;
1560 image_create_info.extent.depth = 1;
1561 image_create_info.mipLevels = 1;
1562 image_create_info.arrayLayers = 1;
1563 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001564 // Image tiling must be optimal to trigger error when aliasing linear buffer
1565 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1567 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1568 image_create_info.queueFamilyIndexCount = 0;
1569 image_create_info.pQueueFamilyIndices = NULL;
1570 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1571 image_create_info.flags = 0;
1572
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1574 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001575 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1576 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577
Tobin Ehlis077ded32016-05-12 17:39:13 -06001578 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1579
1580 VkMemoryAllocateInfo alloc_info = {};
1581 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1582 alloc_info.pNext = NULL;
1583 alloc_info.memoryTypeIndex = 0;
1584 // Ensure memory is big enough for both bindings
1585 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001586 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1587 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001588 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001589 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001590 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001591 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001592 return;
1593 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1595 ASSERT_VK_SUCCESS(err);
1596 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1597 ASSERT_VK_SUCCESS(err);
1598
Rene Lindsayd14f5572016-12-16 14:57:18 -07001599 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1600
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001602 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001603 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1604 m_errorMonitor->VerifyFound();
1605
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001606 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // aliasing buffer2
1608 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1609 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001610 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1611 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001612 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001613 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001615 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001616 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001617 m_errorMonitor->VerifyFound();
1618
1619 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001620 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001621 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001622 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001623 vkFreeMemory(m_device->device(), mem, NULL);
1624 vkFreeMemory(m_device->device(), mem_img, NULL);
1625}
1626
Tobin Ehlis35372522016-05-12 08:32:31 -06001627TEST_F(VkLayerTest, InvalidMemoryMapping) {
1628 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1629 VkResult err;
1630 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001631 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001632
1633 VkBuffer buffer;
1634 VkDeviceMemory mem;
1635 VkMemoryRequirements mem_reqs;
1636
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001637 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1638
Tobin Ehlis35372522016-05-12 08:32:31 -06001639 VkBufferCreateInfo buf_info = {};
1640 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1641 buf_info.pNext = NULL;
1642 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1643 buf_info.size = 256;
1644 buf_info.queueFamilyIndexCount = 0;
1645 buf_info.pQueueFamilyIndices = NULL;
1646 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1647 buf_info.flags = 0;
1648 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1652 VkMemoryAllocateInfo alloc_info = {};
1653 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1654 alloc_info.pNext = NULL;
1655 alloc_info.memoryTypeIndex = 0;
1656
1657 // Ensure memory is big enough for both bindings
1658 static const VkDeviceSize allocation_size = 0x10000;
1659 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001660 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 -06001661 if (!pass) {
1662 vkDestroyBuffer(m_device->device(), buffer, NULL);
1663 return;
1664 }
1665 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1666 ASSERT_VK_SUCCESS(err);
1667
1668 uint8_t *pData;
1669 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001670 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 -06001671 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1672 m_errorMonitor->VerifyFound();
1673 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001674 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001675 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1677 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1678 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 m_errorMonitor->VerifyFound();
1680
1681 // Unmap the memory to avoid re-map error
1682 vkUnmapMemory(m_device->device(), mem);
1683 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1685 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1686 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001687 m_errorMonitor->VerifyFound();
1688 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1690 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 m_errorMonitor->VerifyFound();
1692 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 vkUnmapMemory(m_device->device(), mem);
1695 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696
Tobin Ehlis35372522016-05-12 08:32:31 -06001697 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001698 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 ASSERT_VK_SUCCESS(err);
1700 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001701 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001703 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001705 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1706 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001707
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 // Now flush range that oversteps mapped range
1709 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001710 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001711 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001713 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1715 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1716 m_errorMonitor->VerifyFound();
1717
1718 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1719 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001720 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001721 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001722 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001723 mmr.size = VK_WHOLE_SIZE;
1724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001725 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1726 m_errorMonitor->VerifyFound();
1727
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001728#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001729 // Some platforms have an atomsize of 1 which makes the test meaningless
1730 if (atom_size > 3) {
1731 // Now with an offset NOT a multiple of the device limit
1732 vkUnmapMemory(m_device->device(), mem);
1733 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1734 ASSERT_VK_SUCCESS(err);
1735 mmr.offset = 3; // Not a multiple of atom_size
1736 mmr.size = VK_WHOLE_SIZE;
1737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1738 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1739 m_errorMonitor->VerifyFound();
1740
1741 // Now with a size NOT a multiple of the device limit
1742 vkUnmapMemory(m_device->device(), mem);
1743 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1744 ASSERT_VK_SUCCESS(err);
1745 mmr.offset = atom_size;
1746 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1748 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1749 m_errorMonitor->VerifyFound();
1750 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001751#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001752 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1753 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001754 if (!pass) {
1755 vkFreeMemory(m_device->device(), mem, NULL);
1756 vkDestroyBuffer(m_device->device(), buffer, NULL);
1757 return;
1758 }
1759 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1760 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1761
1762 vkDestroyBuffer(m_device->device(), buffer, NULL);
1763 vkFreeMemory(m_device->device(), mem, NULL);
1764}
1765
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001766#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001767TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1768 VkResult err;
1769 bool pass;
1770
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001771 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1772 // following declaration (which is temporarily being moved below):
1773 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001774 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001775 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001776 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001778 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001779 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001780
Tony Barbour1fa09702017-03-16 12:09:08 -06001781 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001782
Ian Elliott3f06ce52016-04-29 14:46:21 -06001783#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1784#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1785 // Use the functions from the VK_KHR_android_surface extension without
1786 // enabling that extension:
1787
1788 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001789 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1791 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001792 pass = (err != VK_SUCCESS);
1793 ASSERT_TRUE(pass);
1794 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001795#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797#if defined(VK_USE_PLATFORM_MIR_KHR)
1798 // Use the functions from the VK_KHR_mir_surface extension without enabling
1799 // that extension:
1800
1801 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001802 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001804 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1805 pass = (err != VK_SUCCESS);
1806 ASSERT_TRUE(pass);
1807 m_errorMonitor->VerifyFound();
1808
1809 // Tell whether an mir_connection supports presentation:
1810 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1812 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001813 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001814#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815
Ian Elliott3f06ce52016-04-29 14:46:21 -06001816#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1817 // Use the functions from the VK_KHR_wayland_surface extension without
1818 // enabling that extension:
1819
1820 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001821 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1823 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001824 pass = (err != VK_SUCCESS);
1825 ASSERT_TRUE(pass);
1826 m_errorMonitor->VerifyFound();
1827
1828 // Tell whether an wayland_display supports presentation:
1829 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1831 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001832 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001833#endif // VK_USE_PLATFORM_WAYLAND_KHR
1834#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001835
Ian Elliott3f06ce52016-04-29 14:46:21 -06001836#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001837 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1838 // TO NON-LINUX PLATFORMS:
1839 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840 // Use the functions from the VK_KHR_win32_surface extension without
1841 // enabling that extension:
1842
1843 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001844 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1846 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001847 pass = (err != VK_SUCCESS);
1848 ASSERT_TRUE(pass);
1849 m_errorMonitor->VerifyFound();
1850
1851 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001853 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001858#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001859 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1860 // TO NON-LINUX PLATFORMS:
1861 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001862#endif
1863#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001864 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1865 // that extension:
1866
1867 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001868 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001870 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1871 pass = (err != VK_SUCCESS);
1872 ASSERT_TRUE(pass);
1873 m_errorMonitor->VerifyFound();
1874
1875 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001876 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001877 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1879 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001880 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001881// Set this (for now, until all platforms are supported and tested):
1882#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001883#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001884
Ian Elliott12630812016-04-29 14:35:43 -06001885#if defined(VK_USE_PLATFORM_XLIB_KHR)
1886 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1887 // that extension:
1888
1889 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001890 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001892 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1893 pass = (err != VK_SUCCESS);
1894 ASSERT_TRUE(pass);
1895 m_errorMonitor->VerifyFound();
1896
1897 // Tell whether an Xlib VisualID supports presentation:
1898 Display *dpy = NULL;
1899 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001901 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1902 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001903// Set this (for now, until all platforms are supported and tested):
1904#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001905#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001906
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001907// Use the functions from the VK_KHR_surface extension without enabling
1908// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001909
Ian Elliott489eec02016-05-05 14:12:44 -06001910#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001913 vkDestroySurfaceKHR(instance(), surface, NULL);
1914 m_errorMonitor->VerifyFound();
1915
1916 // Check if surface supports presentation:
1917 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001919 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface capabilities:
1925 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1927 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001928 pass = (err != VK_SUCCESS);
1929 ASSERT_TRUE(pass);
1930 m_errorMonitor->VerifyFound();
1931
1932 // Check surface formats:
1933 uint32_t format_count = 0;
1934 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1936 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001937 pass = (err != VK_SUCCESS);
1938 ASSERT_TRUE(pass);
1939 m_errorMonitor->VerifyFound();
1940
1941 // Check surface present modes:
1942 uint32_t present_mode_count = 0;
1943 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1945 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001946 pass = (err != VK_SUCCESS);
1947 ASSERT_TRUE(pass);
1948 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001949#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001950
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 // Use the functions from the VK_KHR_swapchain extension without enabling
1952 // that extension:
1953
1954 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1957 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001958 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001959 pass = (err != VK_SUCCESS);
1960 ASSERT_TRUE(pass);
1961 m_errorMonitor->VerifyFound();
1962
1963 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1965 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 pass = (err != VK_SUCCESS);
1967 ASSERT_TRUE(pass);
1968 m_errorMonitor->VerifyFound();
1969
Chris Forbeseb7d5502016-09-13 18:19:21 +12001970 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1971 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1972 VkFence fence;
1973 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1974
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001977 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001978 pass = (err != VK_SUCCESS);
1979 ASSERT_TRUE(pass);
1980 m_errorMonitor->VerifyFound();
1981
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 vkDestroyFence(m_device->device(), fence, nullptr);
1983
Ian Elliott1c32c772016-04-28 14:47:13 -06001984 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001985 //
1986 // NOTE: Currently can't test this because a real swapchain is needed (as
1987 // opposed to the fake one we created) in order for the layer to lookup the
1988 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001989
1990 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001992 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1993 m_errorMonitor->VerifyFound();
1994}
Chris Forbes09368e42016-10-13 11:59:22 +13001995#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001996
Karl Schultz6addd812016-02-02 17:17:23 -07001997TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1998 VkResult err;
1999 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002000
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2002 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002003
Tony Barbour1fa09702017-03-16 12:09:08 -06002004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
2006 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002007 VkImage image;
2008 VkDeviceMemory mem;
2009 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
Karl Schultz6addd812016-02-02 17:17:23 -07002011 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2012 const int32_t tex_width = 32;
2013 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Tony Barboureb254902015-07-15 12:50:33 -06002015 VkImageCreateInfo image_create_info = {};
2016 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002017 image_create_info.pNext = NULL;
2018 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2019 image_create_info.format = tex_format;
2020 image_create_info.extent.width = tex_width;
2021 image_create_info.extent.height = tex_height;
2022 image_create_info.extent.depth = 1;
2023 image_create_info.mipLevels = 1;
2024 image_create_info.arrayLayers = 1;
2025 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2026 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2027 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2028 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002029 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002030
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002031 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002032 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002033 mem_alloc.pNext = NULL;
2034 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chia-I Wuf7458c52015-10-26 21:10:41 +08002036 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002037 ASSERT_VK_SUCCESS(err);
2038
Karl Schultz6addd812016-02-02 17:17:23 -07002039 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Mark Lobodzinski23065352015-05-29 09:32:35 -05002041 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 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 -07002044 if (!pass) { // If we can't find any unmappable memory this test doesn't
2045 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002046 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002047 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002048 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002049
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002050 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002051 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002052 ASSERT_VK_SUCCESS(err);
2053
2054 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002055 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002056 ASSERT_VK_SUCCESS(err);
2057
2058 // Map memory as if to initialize the image
2059 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002060 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002062 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002063
Chia-I Wuf7458c52015-10-26 21:10:41 +08002064 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002065 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066}
2067
Karl Schultz6addd812016-02-02 17:17:23 -07002068TEST_F(VkLayerTest, RebindMemory) {
2069 VkResult err;
2070 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002071
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002073
Tony Barbour1fa09702017-03-16 12:09:08 -06002074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002075
2076 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002077 VkImage image;
2078 VkDeviceMemory mem1;
2079 VkDeviceMemory mem2;
2080 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002081
Karl Schultz6addd812016-02-02 17:17:23 -07002082 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2083 const int32_t tex_width = 32;
2084 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085
Tony Barboureb254902015-07-15 12:50:33 -06002086 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2088 image_create_info.pNext = NULL;
2089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2090 image_create_info.format = tex_format;
2091 image_create_info.extent.width = tex_width;
2092 image_create_info.extent.height = tex_height;
2093 image_create_info.extent.depth = 1;
2094 image_create_info.mipLevels = 1;
2095 image_create_info.arrayLayers = 1;
2096 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2097 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2098 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2099 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002100
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002101 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002102 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2103 mem_alloc.pNext = NULL;
2104 mem_alloc.allocationSize = 0;
2105 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002106
Karl Schultz6addd812016-02-02 17:17:23 -07002107 // Introduce failure, do NOT set memProps to
2108 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002109 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002110 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002111 ASSERT_VK_SUCCESS(err);
2112
Karl Schultz6addd812016-02-02 17:17:23 -07002113 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002114
2115 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002116 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002117 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002118
2119 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002120 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002122 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123 ASSERT_VK_SUCCESS(err);
2124
2125 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002126 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002127 ASSERT_VK_SUCCESS(err);
2128
Karl Schultz6addd812016-02-02 17:17:23 -07002129 // Introduce validation failure, try to bind a different memory object to
2130 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002133 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002134
Chia-I Wuf7458c52015-10-26 21:10:41 +08002135 vkDestroyImage(m_device->device(), image, NULL);
2136 vkFreeMemory(m_device->device(), mem1, NULL);
2137 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002138}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002139
Karl Schultz6addd812016-02-02 17:17:23 -07002140TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002141 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002142
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2144 "submitted in SIGNALED state. Fences "
2145 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002146
2147 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002148 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2149 fenceInfo.pNext = NULL;
2150 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002151
Tony Barbour1fa09702017-03-16 12:09:08 -06002152 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002153 ASSERT_NO_FATAL_FAILURE(InitViewport());
2154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2155
Tony Barbour552f6c02016-12-21 14:34:07 -07002156 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002157 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002158 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002159
2160 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002161
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002162 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2164 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002165 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002166 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002167 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002168 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002169 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002172
2173 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002174 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002176 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002177}
Chris Forbes4e44c912016-06-16 10:20:00 +12002178
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002179TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002180 TEST_DESCRIPTION(
2181 "Specify wrong usage for image then create conflicting view of image "
2182 "Initialize buffer with wrong usage then perform copy expecting errors "
2183 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002185
Tony Barbour1fa09702017-03-16 12:09:08 -06002186 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002187 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002188 if (!format) {
2189 printf(" No Depth + Stencil format found. Skipped.\n");
2190 return;
2191 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002194 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002195 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002196 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageView dsv;
2199 VkImageViewCreateInfo dsvci = {};
2200 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2201 dsvci.image = image.handle();
2202 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002203 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002204 dsvci.subresourceRange.layerCount = 1;
2205 dsvci.subresourceRange.baseMipLevel = 0;
2206 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002207 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002208
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 // Create a view with depth / stencil aspect for image with different usage
2210 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002211
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002212 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
2214 // Initialize buffer with TRANSFER_DST usage
2215 vk_testing::Buffer buffer;
2216 VkMemoryPropertyFlags reqs = 0;
2217 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2218 VkBufferImageCopy region = {};
2219 region.bufferRowLength = 128;
2220 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002221 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002222 region.imageSubresource.layerCount = 1;
2223 region.imageExtent.height = 16;
2224 region.imageExtent.width = 16;
2225 region.imageExtent.depth = 1;
2226
Mark Lobodzinski80871462017-02-16 10:37:27 -07002227 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002228 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002229
Chris Forbesda581202016-10-06 18:25:26 +13002230 // two separate errors from this call:
2231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2233
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002234 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2235 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002236 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002237}
Tony Barbour75d79f02016-08-30 09:39:07 -06002238
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002239TEST_F(VkLayerTest, LeakAnObject) {
2240 VkResult err;
2241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002242 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002243
2244 // Note that we have to create a new device since destroying the
2245 // framework's device causes Teardown() to fail and just calling Teardown
2246 // will destroy the errorMonitor.
2247
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002249
Tony Barbour1fa09702017-03-16 12:09:08 -06002250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002252 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 std::vector<VkDeviceQueueCreateInfo> queue_info;
2254 queue_info.reserve(queue_props.size());
2255 std::vector<std::vector<float>> queue_priorities;
2256 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2257 VkDeviceQueueCreateInfo qi = {};
2258 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2259 qi.pNext = NULL;
2260 qi.queueFamilyIndex = i;
2261 qi.queueCount = queue_props[i].queueCount;
2262 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2263 qi.pQueuePriorities = queue_priorities[i].data();
2264 queue_info.push_back(qi);
2265 }
2266
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002267 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002268
2269 // The sacrificial device object
2270 VkDevice testDevice;
2271 VkDeviceCreateInfo device_create_info = {};
2272 auto features = m_device->phy().features();
2273 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2274 device_create_info.pNext = NULL;
2275 device_create_info.queueCreateInfoCount = queue_info.size();
2276 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002277 device_create_info.enabledLayerCount = 0;
2278 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002279 device_create_info.pEnabledFeatures = &features;
2280 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2281 ASSERT_VK_SUCCESS(err);
2282
2283 VkFence fence;
2284 VkFenceCreateInfo fence_create_info = {};
2285 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2286 fence_create_info.pNext = NULL;
2287 fence_create_info.flags = 0;
2288 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2289 ASSERT_VK_SUCCESS(err);
2290
2291 // Induce failure by not calling vkDestroyFence
2292 vkDestroyDevice(testDevice, NULL);
2293 m_errorMonitor->VerifyFound();
2294}
2295
2296TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002297 TEST_DESCRIPTION(
2298 "Allocate command buffers from one command pool and "
2299 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002300
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002302
Tony Barbour1fa09702017-03-16 12:09:08 -06002303 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002304 VkCommandPool command_pool_one;
2305 VkCommandPool command_pool_two;
2306
2307 VkCommandPoolCreateInfo pool_create_info{};
2308 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2309 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2310 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2311
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002312 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002313
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002314 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002315
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002316 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002317 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002318 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002319 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002320 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002321 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002322 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002323
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002324 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002325
2326 m_errorMonitor->VerifyFound();
2327
2328 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2329 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2330}
2331
2332TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2333 VkResult err;
2334
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002335 TEST_DESCRIPTION(
2336 "Allocate descriptor sets from one DS pool and "
2337 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002338
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002340
Tony Barbour1fa09702017-03-16 12:09:08 -06002341 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2343
2344 VkDescriptorPoolSize ds_type_count = {};
2345 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2346 ds_type_count.descriptorCount = 1;
2347
2348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2350 ds_pool_ci.pNext = NULL;
2351 ds_pool_ci.flags = 0;
2352 ds_pool_ci.maxSets = 1;
2353 ds_pool_ci.poolSizeCount = 1;
2354 ds_pool_ci.pPoolSizes = &ds_type_count;
2355
2356 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002357 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002358 ASSERT_VK_SUCCESS(err);
2359
2360 // Create a second descriptor pool
2361 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 VkDescriptorSetLayoutBinding dsl_binding = {};
2366 dsl_binding.binding = 0;
2367 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2368 dsl_binding.descriptorCount = 1;
2369 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2370 dsl_binding.pImmutableSamplers = NULL;
2371
2372 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2373 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2374 ds_layout_ci.pNext = NULL;
2375 ds_layout_ci.bindingCount = 1;
2376 ds_layout_ci.pBindings = &dsl_binding;
2377
2378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380 ASSERT_VK_SUCCESS(err);
2381
2382 VkDescriptorSet descriptorSet;
2383 VkDescriptorSetAllocateInfo alloc_info = {};
2384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2385 alloc_info.descriptorSetCount = 1;
2386 alloc_info.descriptorPool = ds_pool_one;
2387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002389 ASSERT_VK_SUCCESS(err);
2390
2391 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2392
2393 m_errorMonitor->VerifyFound();
2394
2395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2396 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2397 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2398}
2399
2400TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002402
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002403 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002404
Tony Barbour1fa09702017-03-16 12:09:08 -06002405 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002406
2407 // Pass bogus handle into GetImageMemoryRequirements
2408 VkMemoryRequirements mem_reqs;
2409 uint64_t fakeImageHandle = 0xCADECADE;
2410 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2411
2412 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2413
2414 m_errorMonitor->VerifyFound();
2415}
2416
Mike Schuchardt17838902017-02-21 09:48:06 -07002417TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2418 TEST_DESCRIPTION(
2419 "Try to destroy a render pass object using a device other than the one it was created on. "
2420 "This should generate a distinct error from the invalid handle error.");
2421 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002422 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2424
2425 // Create second device
2426 float priorities[] = {1.0f};
2427 VkDeviceQueueCreateInfo queue_info{};
2428 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2429 queue_info.pNext = NULL;
2430 queue_info.flags = 0;
2431 queue_info.queueFamilyIndex = 0;
2432 queue_info.queueCount = 1;
2433 queue_info.pQueuePriorities = &priorities[0];
2434
2435 VkDeviceCreateInfo device_create_info = {};
2436 auto features = m_device->phy().features();
2437 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2438 device_create_info.pNext = NULL;
2439 device_create_info.queueCreateInfoCount = 1;
2440 device_create_info.pQueueCreateInfos = &queue_info;
2441 device_create_info.enabledLayerCount = 0;
2442 device_create_info.ppEnabledLayerNames = NULL;
2443 device_create_info.pEnabledFeatures = &features;
2444
2445 VkDevice second_device;
2446 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2447
2448 // Try to destroy the renderpass from the first device using the second device
2449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2450 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2451 m_errorMonitor->VerifyFound();
2452
2453 vkDestroyDevice(second_device, NULL);
2454}
2455
Karl Schultz6addd812016-02-02 17:17:23 -07002456TEST_F(VkLayerTest, PipelineNotBound) {
2457 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002458
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002459 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002460
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002462
Tony Barbour1fa09702017-03-16 12:09:08 -06002463 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002465
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002466 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002467 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469
2470 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002471 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2472 ds_pool_ci.pNext = NULL;
2473 ds_pool_ci.maxSets = 1;
2474 ds_pool_ci.poolSizeCount = 1;
2475 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002476
2477 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 dsl_binding.binding = 0;
2483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2484 dsl_binding.descriptorCount = 1;
2485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2486 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002487
2488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2490 ds_layout_ci.pNext = NULL;
2491 ds_layout_ci.bindingCount = 1;
2492 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002493
2494 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496 ASSERT_VK_SUCCESS(err);
2497
2498 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002499 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002501 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002502 alloc_info.descriptorPool = ds_pool;
2503 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505 ASSERT_VK_SUCCESS(err);
2506
2507 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002508 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2509 pipeline_layout_ci.pNext = NULL;
2510 pipeline_layout_ci.setLayoutCount = 1;
2511 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002512
2513 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002514 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002515 ASSERT_VK_SUCCESS(err);
2516
Mark Youngad779052016-01-06 14:26:04 -07002517 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002518
Tony Barbour552f6c02016-12-21 14:34:07 -07002519 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002520 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002522 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002523
Chia-I Wuf7458c52015-10-26 21:10:41 +08002524 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002527}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002528
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002529TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2530 VkResult err;
2531
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002532 TEST_DESCRIPTION(
2533 "Test validation check for an invalid memory type index "
2534 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002535
Tony Barbour1fa09702017-03-16 12:09:08 -06002536 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002537
2538 // Create an image, allocate memory, set a bad typeIndex and then try to
2539 // bind it
2540 VkImage image;
2541 VkDeviceMemory mem;
2542 VkMemoryRequirements mem_reqs;
2543 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2544 const int32_t tex_width = 32;
2545 const int32_t tex_height = 32;
2546
2547 VkImageCreateInfo image_create_info = {};
2548 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2549 image_create_info.pNext = NULL;
2550 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2551 image_create_info.format = tex_format;
2552 image_create_info.extent.width = tex_width;
2553 image_create_info.extent.height = tex_height;
2554 image_create_info.extent.depth = 1;
2555 image_create_info.mipLevels = 1;
2556 image_create_info.arrayLayers = 1;
2557 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2558 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2559 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2560 image_create_info.flags = 0;
2561
2562 VkMemoryAllocateInfo mem_alloc = {};
2563 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2564 mem_alloc.pNext = NULL;
2565 mem_alloc.allocationSize = 0;
2566 mem_alloc.memoryTypeIndex = 0;
2567
2568 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2569 ASSERT_VK_SUCCESS(err);
2570
2571 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2572 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002573
2574 // Introduce Failure, select invalid TypeIndex
2575 VkPhysicalDeviceMemoryProperties memory_info;
2576
2577 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2578 unsigned int i;
2579 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2580 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2581 mem_alloc.memoryTypeIndex = i;
2582 break;
2583 }
2584 }
2585 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002586 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002587 vkDestroyImage(m_device->device(), image, NULL);
2588 return;
2589 }
2590
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002591 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 -06002592
2593 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2594 ASSERT_VK_SUCCESS(err);
2595
2596 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2597 (void)err;
2598
2599 m_errorMonitor->VerifyFound();
2600
2601 vkDestroyImage(m_device->device(), image, NULL);
2602 vkFreeMemory(m_device->device(), mem, NULL);
2603}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002604
Karl Schultz6addd812016-02-02 17:17:23 -07002605TEST_F(VkLayerTest, BindInvalidMemory) {
2606 VkResult err;
2607 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002608
Tony Barbour1fa09702017-03-16 12:09:08 -06002609 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002610
Cortf801b982017-01-17 18:10:21 -08002611 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002612 const int32_t tex_width = 256;
2613 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002614
2615 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002616 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2617 image_create_info.pNext = NULL;
2618 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2619 image_create_info.format = tex_format;
2620 image_create_info.extent.width = tex_width;
2621 image_create_info.extent.height = tex_height;
2622 image_create_info.extent.depth = 1;
2623 image_create_info.mipLevels = 1;
2624 image_create_info.arrayLayers = 1;
2625 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002626 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002627 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2628 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002629
Cortf801b982017-01-17 18:10:21 -08002630 VkBufferCreateInfo buffer_create_info = {};
2631 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2632 buffer_create_info.pNext = NULL;
2633 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002634 buffer_create_info.size = 4 * 1024 * 1024;
2635 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002636 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002637
Cortf801b982017-01-17 18:10:21 -08002638 // Create an image/buffer, allocate memory, free it, and then try to bind it
2639 {
2640 VkImage image = VK_NULL_HANDLE;
2641 VkBuffer buffer = VK_NULL_HANDLE;
2642 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2643 ASSERT_VK_SUCCESS(err);
2644 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2645 ASSERT_VK_SUCCESS(err);
2646 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2647 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2648 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2651 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2652 image_mem_alloc.allocationSize = image_mem_reqs.size;
2653 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2654 ASSERT_TRUE(pass);
2655 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2656 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2657 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2658 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002659
Cortf801b982017-01-17 18:10:21 -08002660 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2661 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2662 ASSERT_VK_SUCCESS(err);
2663 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2664 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002665
Cortf801b982017-01-17 18:10:21 -08002666 vkFreeMemory(device(), image_mem, NULL);
2667 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002668
Cortf801b982017-01-17 18:10:21 -08002669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2670 err = vkBindImageMemory(device(), image, image_mem, 0);
2671 (void)err; // This may very well return an error.
2672 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2675 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 vkDestroyImage(m_device->device(), image, NULL);
2680 vkDestroyBuffer(m_device->device(), buffer, NULL);
2681 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002682
2683 // Try to bind memory to an object that already has a memory binding
2684 {
2685 VkImage image = VK_NULL_HANDLE;
2686 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2687 ASSERT_VK_SUCCESS(err);
2688 VkBuffer buffer = VK_NULL_HANDLE;
2689 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2690 ASSERT_VK_SUCCESS(err);
2691 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2692 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2693 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2694 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2695 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2696 image_alloc_info.allocationSize = image_mem_reqs.size;
2697 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2698 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2699 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2700 ASSERT_TRUE(pass);
2701 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2702 ASSERT_TRUE(pass);
2703 VkDeviceMemory image_mem, buffer_mem;
2704 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2705 ASSERT_VK_SUCCESS(err);
2706 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2707 ASSERT_VK_SUCCESS(err);
2708
2709 err = vkBindImageMemory(device(), image, image_mem, 0);
2710 ASSERT_VK_SUCCESS(err);
2711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2712 err = vkBindImageMemory(device(), image, image_mem, 0);
2713 (void)err; // This may very well return an error.
2714 m_errorMonitor->VerifyFound();
2715
2716 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2717 ASSERT_VK_SUCCESS(err);
2718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2719 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2720 (void)err; // This may very well return an error.
2721 m_errorMonitor->VerifyFound();
2722
2723 vkFreeMemory(device(), image_mem, NULL);
2724 vkFreeMemory(device(), buffer_mem, NULL);
2725 vkDestroyImage(device(), image, NULL);
2726 vkDestroyBuffer(device(), buffer, NULL);
2727 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002728
Cort Strattonde748202017-02-17 12:50:01 -08002729 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002730 {
2731 VkImage image = VK_NULL_HANDLE;
2732 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2733 ASSERT_VK_SUCCESS(err);
2734 VkBuffer buffer = VK_NULL_HANDLE;
2735 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2736 ASSERT_VK_SUCCESS(err);
2737 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2738 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2739 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2740 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2741 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002742 // Leave some extra space for alignment wiggle room
2743 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002744 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002745 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002746 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2747 ASSERT_TRUE(pass);
2748 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2749 ASSERT_TRUE(pass);
2750 VkDeviceMemory image_mem, buffer_mem;
2751 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2752 ASSERT_VK_SUCCESS(err);
2753 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2754 ASSERT_VK_SUCCESS(err);
2755
Cort Strattonde748202017-02-17 12:50:01 -08002756 // Test unaligned memory offset
2757 {
2758 if (image_mem_reqs.alignment > 1) {
2759 VkDeviceSize image_offset = 1;
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2761 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
Cort6c7dff72017-01-27 18:34:50 -08002765
Cort Strattonde748202017-02-17 12:50:01 -08002766 if (buffer_mem_reqs.alignment > 1) {
2767 VkDeviceSize buffer_offset = 1;
2768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2769 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2770 (void)err; // This may very well return an error.
2771 m_errorMonitor->VerifyFound();
2772 }
2773 }
2774
2775 // Test memory offsets outside the memory allocation
2776 {
2777 VkDeviceSize image_offset =
2778 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2780 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783
2784 VkDeviceSize buffer_offset =
2785 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2787 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2788 (void)err; // This may very well return an error.
2789 m_errorMonitor->VerifyFound();
2790 }
2791
2792 // Test memory offsets within the memory allocation, but which leave too little memory for
2793 // the resource.
2794 {
2795 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002796 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2798 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2799 (void)err; // This may very well return an error.
2800 m_errorMonitor->VerifyFound();
2801 }
2802
2803 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2804 if (buffer_offset > 0) {
2805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2806 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2807 (void)err; // This may very well return an error.
2808 m_errorMonitor->VerifyFound();
2809 }
2810 }
Cort6c7dff72017-01-27 18:34:50 -08002811
2812 vkFreeMemory(device(), image_mem, NULL);
2813 vkFreeMemory(device(), buffer_mem, NULL);
2814 vkDestroyImage(device(), image, NULL);
2815 vkDestroyBuffer(device(), buffer, NULL);
2816 }
2817
Cort Stratton4c38bb52017-01-28 13:33:10 -08002818 // Try to bind memory to an object with an invalid memory type
2819 {
2820 VkImage image = VK_NULL_HANDLE;
2821 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2822 ASSERT_VK_SUCCESS(err);
2823 VkBuffer buffer = VK_NULL_HANDLE;
2824 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2825 ASSERT_VK_SUCCESS(err);
2826 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2827 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2828 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2829 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2830 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2831 image_alloc_info.allocationSize = image_mem_reqs.size;
2832 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2833 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002834 // Create a mask of available memory types *not* supported by these resources,
2835 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002836 VkPhysicalDeviceMemoryProperties memory_properties = {};
2837 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002838 VkDeviceMemory image_mem, buffer_mem;
2839
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002841 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002842 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2843 ASSERT_TRUE(pass);
2844 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2845 ASSERT_VK_SUCCESS(err);
2846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2847 err = vkBindImageMemory(device(), image, image_mem, 0);
2848 (void)err; // This may very well return an error.
2849 m_errorMonitor->VerifyFound();
2850 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002851 }
2852
Cort Stratton4c38bb52017-01-28 13:33:10 -08002853 uint32_t buffer_unsupported_mem_type_bits =
2854 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002855 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002856 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2857 ASSERT_TRUE(pass);
2858 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2859 ASSERT_VK_SUCCESS(err);
2860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2861 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2862 (void)err; // This may very well return an error.
2863 m_errorMonitor->VerifyFound();
2864 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002865 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002866
Cort Stratton4c38bb52017-01-28 13:33:10 -08002867 vkDestroyImage(device(), image, NULL);
2868 vkDestroyBuffer(device(), buffer, NULL);
2869 }
2870
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002871 // Try to bind memory to an image created with sparse memory flags
2872 {
2873 VkImageCreateInfo sparse_image_create_info = image_create_info;
2874 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2875 VkImageFormatProperties image_format_properties = {};
2876 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2877 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2878 sparse_image_create_info.usage, sparse_image_create_info.flags,
2879 &image_format_properties);
2880 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2881 // most likely means sparse formats aren't supported here; skip this test.
2882 } else {
2883 ASSERT_VK_SUCCESS(err);
2884 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002885 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002886 return;
2887 } else {
2888 VkImage sparse_image = VK_NULL_HANDLE;
2889 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2890 ASSERT_VK_SUCCESS(err);
2891 VkMemoryRequirements sparse_mem_reqs = {};
2892 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2893 if (sparse_mem_reqs.memoryTypeBits != 0) {
2894 VkMemoryAllocateInfo sparse_mem_alloc = {};
2895 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2896 sparse_mem_alloc.pNext = NULL;
2897 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2898 sparse_mem_alloc.memoryTypeIndex = 0;
2899 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2900 ASSERT_TRUE(pass);
2901 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2902 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2903 ASSERT_VK_SUCCESS(err);
2904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2905 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2906 // This may very well return an error.
2907 (void)err;
2908 m_errorMonitor->VerifyFound();
2909 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2910 }
2911 vkDestroyImage(m_device->device(), sparse_image, NULL);
2912 }
2913 }
2914 }
2915
2916 // Try to bind memory to a buffer created with sparse memory flags
2917 {
2918 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2919 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2920 if (!m_device->phy().features().sparseResidencyBuffer) {
2921 // most likely means sparse formats aren't supported here; skip this test.
2922 } else {
2923 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2924 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2925 ASSERT_VK_SUCCESS(err);
2926 VkMemoryRequirements sparse_mem_reqs = {};
2927 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2928 if (sparse_mem_reqs.memoryTypeBits != 0) {
2929 VkMemoryAllocateInfo sparse_mem_alloc = {};
2930 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2931 sparse_mem_alloc.pNext = NULL;
2932 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2933 sparse_mem_alloc.memoryTypeIndex = 0;
2934 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2935 ASSERT_TRUE(pass);
2936 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2937 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2938 ASSERT_VK_SUCCESS(err);
2939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2940 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2941 // This may very well return an error.
2942 (void)err;
2943 m_errorMonitor->VerifyFound();
2944 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2945 }
2946 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2947 }
2948 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002949}
2950
Karl Schultz6addd812016-02-02 17:17:23 -07002951TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2952 VkResult err;
2953 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002954
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002956
Tony Barbour1fa09702017-03-16 12:09:08 -06002957 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002958
Karl Schultz6addd812016-02-02 17:17:23 -07002959 // Create an image object, allocate memory, destroy the object and then try
2960 // to bind it
2961 VkImage image;
2962 VkDeviceMemory mem;
2963 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002964
Karl Schultz6addd812016-02-02 17:17:23 -07002965 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2966 const int32_t tex_width = 32;
2967 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002970 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2971 image_create_info.pNext = NULL;
2972 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2973 image_create_info.format = tex_format;
2974 image_create_info.extent.width = tex_width;
2975 image_create_info.extent.height = tex_height;
2976 image_create_info.extent.depth = 1;
2977 image_create_info.mipLevels = 1;
2978 image_create_info.arrayLayers = 1;
2979 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2980 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2981 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2982 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002983
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002985 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2986 mem_alloc.pNext = NULL;
2987 mem_alloc.allocationSize = 0;
2988 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002989
Chia-I Wuf7458c52015-10-26 21:10:41 +08002990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002991 ASSERT_VK_SUCCESS(err);
2992
Karl Schultz6addd812016-02-02 17:17:23 -07002993 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
2995 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002996 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002997 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002998
2999 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003000 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003001 ASSERT_VK_SUCCESS(err);
3002
3003 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003004 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003005 ASSERT_VK_SUCCESS(err);
3006
3007 // Now Try to bind memory to this destroyed object
3008 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3009 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003010 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003012 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003013
Chia-I Wuf7458c52015-10-26 21:10:41 +08003014 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003015}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003016
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003017TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3018 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3019
Tony Barbour1fa09702017-03-16 12:09:08 -06003020 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3022
3023 VkVertexInputBindingDescription input_binding;
3024 memset(&input_binding, 0, sizeof(input_binding));
3025
3026 VkVertexInputAttributeDescription input_attribs;
3027 memset(&input_attribs, 0, sizeof(input_attribs));
3028
3029 // Pick a really bad format for this purpose and make sure it should fail
3030 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3031 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3032 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003033 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003034 return;
3035 }
3036
3037 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003038 char const *vsSource =
3039 "#version 450\n"
3040 "\n"
3041 "out gl_PerVertex {\n"
3042 " vec4 gl_Position;\n"
3043 "};\n"
3044 "void main(){\n"
3045 " gl_Position = vec4(1);\n"
3046 "}\n";
3047 char const *fsSource =
3048 "#version 450\n"
3049 "\n"
3050 "layout(location=0) out vec4 color;\n"
3051 "void main(){\n"
3052 " color = vec4(1);\n"
3053 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003054
3055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3058
3059 VkPipelineObj pipe(m_device);
3060 pipe.AddColorAttachment();
3061 pipe.AddShader(&vs);
3062 pipe.AddShader(&fs);
3063
3064 pipe.AddVertexInputBindings(&input_binding, 1);
3065 pipe.AddVertexInputAttribs(&input_attribs, 1);
3066
3067 VkDescriptorSetObj descriptorSet(m_device);
3068 descriptorSet.AppendDummy();
3069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3070
3071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3072
3073 m_errorMonitor->VerifyFound();
3074}
3075
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003076TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003077 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003078 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003079
3080 VkMemoryPropertyFlags reqs = 0;
3081 VkImageCreateInfo image_create_info = {};
3082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3083 image_create_info.pNext = NULL;
3084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3085 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3086 image_create_info.extent.width = 256;
3087 image_create_info.extent.height = 256;
3088 image_create_info.extent.depth = 1;
3089 image_create_info.mipLevels = 1;
3090 image_create_info.arrayLayers = 1;
3091 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3092 image_create_info.flags = 0;
3093
3094 VkImageBlit blit_region = {};
3095 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3096 blit_region.srcSubresource.baseArrayLayer = 0;
3097 blit_region.srcSubresource.layerCount = 1;
3098 blit_region.srcSubresource.mipLevel = 0;
3099 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3100 blit_region.dstSubresource.baseArrayLayer = 0;
3101 blit_region.dstSubresource.layerCount = 1;
3102 blit_region.dstSubresource.mipLevel = 0;
3103
3104 // Create two images, the source with sampleCount = 2, and attempt to blit
3105 // between them
3106 {
3107 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003108 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003109 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003110 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003111 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003112 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003113 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003115 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003116 m_errorMonitor->SetDesiredFailureMsg(
3117 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3118 "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 -06003119 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3120 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003121 m_errorMonitor->VerifyFound();
3122 m_commandBuffer->EndCommandBuffer();
3123 }
3124
3125 // Create two images, the dest with sampleCount = 4, and attempt to blit
3126 // between them
3127 {
3128 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003129 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003130 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003131 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003132 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003133 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003134 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003137 m_errorMonitor->SetDesiredFailureMsg(
3138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3139 "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 -06003140 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3141 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003142 m_errorMonitor->VerifyFound();
3143 m_commandBuffer->EndCommandBuffer();
3144 }
3145
3146 VkBufferImageCopy copy_region = {};
3147 copy_region.bufferRowLength = 128;
3148 copy_region.bufferImageHeight = 128;
3149 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3150 copy_region.imageSubresource.layerCount = 1;
3151 copy_region.imageExtent.height = 64;
3152 copy_region.imageExtent.width = 64;
3153 copy_region.imageExtent.depth = 1;
3154
3155 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3156 // buffer to image
3157 {
3158 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003159 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3160 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003163 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003165 m_errorMonitor->SetDesiredFailureMsg(
3166 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3167 "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 -06003168 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3169 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003170 m_errorMonitor->VerifyFound();
3171 m_commandBuffer->EndCommandBuffer();
3172 }
3173
3174 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3175 // image to buffer
3176 {
3177 vk_testing::Buffer dst_buffer;
3178 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3179 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003180 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003181 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003182 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003183 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003184 m_errorMonitor->SetDesiredFailureMsg(
3185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3186 "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 -06003187 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 dst_buffer.handle(), 1, &copy_region);
3189 m_errorMonitor->VerifyFound();
3190 m_commandBuffer->EndCommandBuffer();
3191 }
3192}
3193
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003194TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003195 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003196
3197 VkImageObj src_image(m_device);
3198 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3199 VkImageObj dst_image(m_device);
3200 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3201 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003202 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 VkImageBlit blitRegion = {};
3205 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3206 blitRegion.srcSubresource.baseArrayLayer = 0;
3207 blitRegion.srcSubresource.layerCount = 1;
3208 blitRegion.srcSubresource.mipLevel = 0;
3209 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3210 blitRegion.dstSubresource.baseArrayLayer = 0;
3211 blitRegion.dstSubresource.layerCount = 1;
3212 blitRegion.dstSubresource.mipLevel = 0;
3213
Dave Houlton34df4cb2016-12-01 16:43:06 -07003214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3215
3216 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3217 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003218
3219 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003220 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003221 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3222 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 m_errorMonitor->VerifyFound();
3225
Dave Houlton34df4cb2016-12-01 16:43:06 -07003226 // Test should generate 2 VU failures
3227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003229
3230 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003231 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3232 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003233
Dave Houlton34df4cb2016-12-01 16:43:06 -07003234 // TODO: Note that this only verifies that at least one of the VU enums was found
3235 // 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 -06003236 m_errorMonitor->VerifyFound();
3237
Tony Barbour552f6c02016-12-21 14:34:07 -07003238 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003239}
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3242 VkResult err;
3243 bool pass;
3244
3245 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003246 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003247
3248 // If w/d/h granularity is 1, test is not meaningful
3249 // TODO: When virtual device limits are available, create a set of limits for this test that
3250 // will always have a granularity of > 1 for w, h, and d
3251 auto index = m_device->graphics_queue_node_index_;
3252 auto queue_family_properties = m_device->phy().queue_properties();
3253
3254 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3255 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3256 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3257 return;
3258 }
3259
3260 // Create two images of different types and try to copy between them
3261 VkImage srcImage;
3262 VkImage dstImage;
3263 VkDeviceMemory srcMem;
3264 VkDeviceMemory destMem;
3265 VkMemoryRequirements memReqs;
3266
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 VkImageCreateInfo image_create_info = {};
3268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3269 image_create_info.pNext = NULL;
3270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3271 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3272 image_create_info.extent.width = 32;
3273 image_create_info.extent.height = 32;
3274 image_create_info.extent.depth = 1;
3275 image_create_info.mipLevels = 1;
3276 image_create_info.arrayLayers = 4;
3277 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3278 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3279 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3280 image_create_info.flags = 0;
3281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003282 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003283 ASSERT_VK_SUCCESS(err);
3284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003285 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003286 ASSERT_VK_SUCCESS(err);
3287
3288 // Allocate memory
3289 VkMemoryAllocateInfo memAlloc = {};
3290 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3291 memAlloc.pNext = NULL;
3292 memAlloc.allocationSize = 0;
3293 memAlloc.memoryTypeIndex = 0;
3294
3295 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3296 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003297 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003298 ASSERT_TRUE(pass);
3299 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3300 ASSERT_VK_SUCCESS(err);
3301
3302 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3303 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003304 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003305 ASSERT_VK_SUCCESS(err);
3306 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3307 ASSERT_VK_SUCCESS(err);
3308
3309 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3310 ASSERT_VK_SUCCESS(err);
3311 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3312 ASSERT_VK_SUCCESS(err);
3313
Tony Barbour552f6c02016-12-21 14:34:07 -07003314 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003315 VkImageCopy copyRegion;
3316 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3317 copyRegion.srcSubresource.mipLevel = 0;
3318 copyRegion.srcSubresource.baseArrayLayer = 0;
3319 copyRegion.srcSubresource.layerCount = 1;
3320 copyRegion.srcOffset.x = 0;
3321 copyRegion.srcOffset.y = 0;
3322 copyRegion.srcOffset.z = 0;
3323 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3324 copyRegion.dstSubresource.mipLevel = 0;
3325 copyRegion.dstSubresource.baseArrayLayer = 0;
3326 copyRegion.dstSubresource.layerCount = 1;
3327 copyRegion.dstOffset.x = 0;
3328 copyRegion.dstOffset.y = 0;
3329 copyRegion.dstOffset.z = 0;
3330 copyRegion.extent.width = 1;
3331 copyRegion.extent.height = 1;
3332 copyRegion.extent.depth = 1;
3333
3334 // Introduce failure by setting srcOffset to a bad granularity value
3335 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3337 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003338 m_errorMonitor->VerifyFound();
3339
3340 // Introduce failure by setting extent to a bad granularity value
3341 copyRegion.srcOffset.y = 0;
3342 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3344 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003345 m_errorMonitor->VerifyFound();
3346
3347 // Now do some buffer/image copies
3348 vk_testing::Buffer buffer;
3349 VkMemoryPropertyFlags reqs = 0;
3350 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3351 VkBufferImageCopy region = {};
3352 region.bufferOffset = 0;
3353 region.bufferRowLength = 3;
3354 region.bufferImageHeight = 128;
3355 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3356 region.imageSubresource.layerCount = 1;
3357 region.imageExtent.height = 16;
3358 region.imageExtent.width = 16;
3359 region.imageExtent.depth = 1;
3360 region.imageOffset.x = 0;
3361 region.imageOffset.y = 0;
3362 region.imageOffset.z = 0;
3363
3364 // Introduce failure by setting bufferRowLength to a bad granularity value
3365 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferRowLength = 128;
3371
3372 // Introduce failure by setting bufferOffset to a bad granularity value
3373 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.bufferOffset = 0;
3379
3380 // Introduce failure by setting bufferImageHeight to a bad granularity value
3381 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386 region.bufferImageHeight = 128;
3387
3388 // Introduce failure by setting imageExtent to a bad granularity value
3389 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3391 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3392 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003393 m_errorMonitor->VerifyFound();
3394 region.imageExtent.width = 16;
3395
3396 // Introduce failure by setting imageOffset to a bad granularity value
3397 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3399 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3400 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003401 m_errorMonitor->VerifyFound();
3402
Tony Barbour552f6c02016-12-21 14:34:07 -07003403 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003404
3405 vkDestroyImage(m_device->device(), srcImage, NULL);
3406 vkDestroyImage(m_device->device(), dstImage, NULL);
3407 vkFreeMemory(m_device->device(), srcMem, NULL);
3408 vkFreeMemory(m_device->device(), destMem, NULL);
3409}
3410
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003411TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003412 TEST_DESCRIPTION(
3413 "Submit command buffer created using one queue family and "
3414 "attempt to submit them on a queue created in a different "
3415 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
Tony Barbour1fa09702017-03-16 12:09:08 -06003417 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003418
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003419 // This test is meaningless unless we have multiple queue families
3420 auto queue_family_properties = m_device->phy().queue_properties();
3421 if (queue_family_properties.size() < 2) {
3422 return;
3423 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003425 // Get safe index of another queue family
3426 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003427 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428 // Create a second queue using a different queue family
3429 VkQueue other_queue;
3430 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3431
3432 // Record an empty cmd buffer
3433 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3434 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3435 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3436 vkEndCommandBuffer(m_commandBuffer->handle());
3437
3438 // And submit on the wrong queue
3439 VkSubmitInfo submit_info = {};
3440 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3441 submit_info.commandBufferCount = 1;
3442 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003443 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003444
3445 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003446}
3447
Chris Forbes4c24a922016-11-16 08:59:10 +13003448TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003449 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003450
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003451 // There are no attachments, but refer to attachment 0.
3452 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003453 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003454 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003455 };
3456
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 VkRenderPass rp;
3459
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003460 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003462 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 m_errorMonitor->VerifyFound();
3464}
3465
Chris Forbesa58c4522016-09-28 15:19:39 +13003466TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3467 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003468 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003469
3470 // A renderpass with two subpasses, both writing the same attachment.
3471 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003472 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3473 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3474 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003475 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003476 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003477 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3479 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkSubpassDependency dep = {0,
3482 1,
3483 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3484 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3485 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3486 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3487 VK_DEPENDENCY_BY_REGION_BIT};
3488 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003489 VkRenderPass rp;
3490 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3491 ASSERT_VK_SUCCESS(err);
3492
3493 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003494 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003495 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3496
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003497 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 VkFramebuffer fb;
3499 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3500 ASSERT_VK_SUCCESS(err);
3501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003502 char const *vsSource =
3503 "#version 450\n"
3504 "void main() { gl_Position = vec4(1); }\n";
3505 char const *fsSource =
3506 "#version 450\n"
3507 "layout(location=0) out vec4 color;\n"
3508 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003509
3510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3512 VkPipelineObj pipe(m_device);
3513 pipe.AddColorAttachment();
3514 pipe.AddShader(&vs);
3515 pipe.AddShader(&fs);
3516 VkViewport view_port = {};
3517 m_viewports.push_back(view_port);
3518 pipe.SetViewport(m_viewports);
3519 VkRect2D rect = {};
3520 m_scissors.push_back(rect);
3521 pipe.SetScissor(m_scissors);
3522
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003523 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003524 VkPipelineLayout pl;
3525 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3526 ASSERT_VK_SUCCESS(err);
3527 pipe.CreateVKPipeline(pl, rp);
3528
Tony Barbour552f6c02016-12-21 14:34:07 -07003529 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003530
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003531 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3532 nullptr,
3533 rp,
3534 fb,
3535 {{
3536 0, 0,
3537 },
3538 {32, 32}},
3539 0,
3540 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003541
3542 // subtest 1: bind in the wrong subpass
3543 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3544 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003545 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 +13003546 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3547 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3548 m_errorMonitor->VerifyFound();
3549
3550 vkCmdEndRenderPass(m_commandBuffer->handle());
3551
3552 // subtest 2: bind in correct subpass, then transition to next subpass
3553 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3554 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3555 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003556 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 +13003557 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3558 m_errorMonitor->VerifyFound();
3559
3560 vkCmdEndRenderPass(m_commandBuffer->handle());
3561
Tony Barbour552f6c02016-12-21 14:34:07 -07003562 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003563
3564 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3565 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3566 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3567}
3568
Tony Barbour4e919972016-08-09 13:27:40 -06003569TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003570 TEST_DESCRIPTION(
3571 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3572 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003573 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3575
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3577 "Cannot execute a render pass with renderArea "
3578 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003579
3580 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3581 m_renderPassBeginInfo.renderArea.extent.width = 257;
3582 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003583 m_commandBuffer->BeginCommandBuffer();
3584 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003585 m_errorMonitor->VerifyFound();
3586}
3587
3588TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003589 TEST_DESCRIPTION(
3590 "Generate INDEPENDENT_BLEND by disabling independent "
3591 "blend and then specifying different blend states for two "
3592 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003593 VkPhysicalDeviceFeatures features = {};
3594 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003595 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003596
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3598 "Invalid Pipeline CreateInfo: If independent blend feature not "
3599 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003600
Cody Northropc31a84f2016-08-22 10:41:47 -06003601 VkDescriptorSetObj descriptorSet(m_device);
3602 descriptorSet.AppendDummy();
3603 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003604
Cody Northropc31a84f2016-08-22 10:41:47 -06003605 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003606 // Create a renderPass with two color attachments
3607 VkAttachmentReference attachments[2] = {};
3608 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003609 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003610 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3611
3612 VkSubpassDescription subpass = {};
3613 subpass.pColorAttachments = attachments;
3614 subpass.colorAttachmentCount = 2;
3615
3616 VkRenderPassCreateInfo rpci = {};
3617 rpci.subpassCount = 1;
3618 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003619 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620
Tony Barbourffd60bd2017-03-09 12:04:55 -07003621 VkAttachmentDescription attach_desc[2] = {};
3622 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3623 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3624 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3625 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3626 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3627 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3628 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3629 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630
Tony Barbourffd60bd2017-03-09 12:04:55 -07003631 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3633
3634 VkRenderPass renderpass;
3635 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003637 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003638
Cody Northropc31a84f2016-08-22 10:41:47 -06003639 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3640 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3641 att_state1.blendEnable = VK_TRUE;
3642 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3643 att_state2.blendEnable = VK_FALSE;
3644 pipeline.AddColorAttachment(0, &att_state1);
3645 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003646 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003647 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003648 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003649}
3650
Mike Weiblen40b160e2017-02-06 19:21:52 -07003651// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3652TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3653 TEST_DESCRIPTION(
3654 "Create a graphics pipeline that is incompatible with the requirements "
3655 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003656 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003657
3658 VkDescriptorSetObj ds_obj(m_device);
3659 ds_obj.AppendDummy();
3660 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3661
3662 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3663
3664 VkPipelineColorBlendAttachmentState att_state1 = {};
3665 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3666 att_state1.blendEnable = VK_TRUE;
3667
3668 VkRenderpassObj rp_obj(m_device);
3669
3670 {
3671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3672 VkPipelineObj pipeline(m_device);
3673 pipeline.AddShader(&vs_obj);
3674 pipeline.AddColorAttachment(0, &att_state1);
3675
3676 VkGraphicsPipelineCreateInfo info = {};
3677 pipeline.InitGraphicsPipelineCreateInfo(&info);
3678 info.pColorBlendState = nullptr;
3679
3680 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3681 m_errorMonitor->VerifyFound();
3682 }
3683}
3684
Chris Forbes26ec2122016-11-29 08:58:33 +13003685#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003686TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3687 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3688 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003689 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3692 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003693
3694 // Create a renderPass with a single color attachment
3695 VkAttachmentReference attach = {};
3696 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3697 VkSubpassDescription subpass = {};
3698 VkRenderPassCreateInfo rpci = {};
3699 rpci.subpassCount = 1;
3700 rpci.pSubpasses = &subpass;
3701 rpci.attachmentCount = 1;
3702 VkAttachmentDescription attach_desc = {};
3703 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3704 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3705 rpci.pAttachments = &attach_desc;
3706 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3707 VkRenderPass rp;
3708 subpass.pDepthStencilAttachment = &attach;
3709 subpass.pColorAttachments = NULL;
3710 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3711 m_errorMonitor->VerifyFound();
3712}
Chris Forbes26ec2122016-11-29 08:58:33 +13003713#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003714
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003715TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003716 TEST_DESCRIPTION(
3717 "Create a framebuffer where a subpass has a preserve "
3718 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003719
Tony Barbour1fa09702017-03-16 12:09:08 -06003720 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3722
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724
3725 VkAttachmentReference color_attach = {};
3726 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3727 color_attach.attachment = 0;
3728 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3729 VkSubpassDescription subpass = {};
3730 subpass.colorAttachmentCount = 1;
3731 subpass.pColorAttachments = &color_attach;
3732 subpass.preserveAttachmentCount = 1;
3733 subpass.pPreserveAttachments = &preserve_attachment;
3734
3735 VkRenderPassCreateInfo rpci = {};
3736 rpci.subpassCount = 1;
3737 rpci.pSubpasses = &subpass;
3738 rpci.attachmentCount = 1;
3739 VkAttachmentDescription attach_desc = {};
3740 attach_desc.format = VK_FORMAT_UNDEFINED;
3741 rpci.pAttachments = &attach_desc;
3742 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3743 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003744 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003745
3746 m_errorMonitor->VerifyFound();
3747
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003748 if (result == VK_SUCCESS) {
3749 vkDestroyRenderPass(m_device->device(), rp, NULL);
3750 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003751}
3752
Chris Forbesc5389742016-06-29 11:49:23 +12003753TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003754 TEST_DESCRIPTION(
3755 "Ensure that CreateRenderPass produces a validation error "
3756 "when the source of a subpass multisample resolve "
3757 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003758
Tony Barbour1fa09702017-03-16 12:09:08 -06003759 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3762 "Subpass 0 requests multisample resolve from attachment 0 which has "
3763 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003764
3765 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 {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},
3769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003772 };
3773
3774 VkAttachmentReference color = {
3775 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3776 };
3777
3778 VkAttachmentReference resolve = {
3779 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3780 };
3781
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003782 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003783
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003784 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003785
3786 VkRenderPass rp;
3787 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3788
3789 m_errorMonitor->VerifyFound();
3790
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003791 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003792}
3793
3794TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003795 TEST_DESCRIPTION(
3796 "Ensure CreateRenderPass produces a validation error "
3797 "when a subpass multisample resolve operation is "
3798 "requested, and the destination of that resolve has "
3799 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003800
Tony Barbour1fa09702017-03-16 12:09:08 -06003801 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003802
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3804 "Subpass 0 requests multisample resolve into attachment 1, which "
3805 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003806
3807 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 {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},
3811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003814 };
3815
3816 VkAttachmentReference color = {
3817 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3818 };
3819
3820 VkAttachmentReference resolve = {
3821 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3822 };
3823
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003824 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003825
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003826 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003827
3828 VkRenderPass rp;
3829 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3830
3831 m_errorMonitor->VerifyFound();
3832
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003834}
3835
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003837 TEST_DESCRIPTION(
3838 "Ensure CreateRenderPass produces a validation error "
3839 "when the color and depth attachments used by a subpass "
3840 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003841
Tony Barbour1fa09702017-03-16 12:09:08 -06003842 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003843
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3845 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
3847 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003848 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_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},
3851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003854 };
3855
3856 VkAttachmentReference color[] = {
3857 {
3858 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3859 },
3860 {
3861 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 };
3864
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003865 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003866
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003867 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003868
3869 VkRenderPass rp;
3870 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3871
3872 m_errorMonitor->VerifyFound();
3873
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003874 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003875}
3876
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003877TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003878 TEST_DESCRIPTION(
3879 "Hit errors when attempting to create a framebuffer :\n"
3880 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3881 " 2. Use a color image as depthStencil attachment\n"
3882 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3883 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3884 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3885 " 6. Framebuffer attachment where dimensions don't match\n"
3886 " 7. Framebuffer attachment w/o identity swizzle\n"
3887 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003888
Tony Barbour1fa09702017-03-16 12:09:08 -06003889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003890 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3891
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003892 m_errorMonitor->SetDesiredFailureMsg(
3893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3894 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003895
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003897 VkAttachmentReference attach = {};
3898 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3899 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003900 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkRenderPassCreateInfo rpci = {};
3902 rpci.subpassCount = 1;
3903 rpci.pSubpasses = &subpass;
3904 rpci.attachmentCount = 1;
3905 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003906 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003907 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 rpci.pAttachments = &attach_desc;
3909 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3910 VkRenderPass rp;
3911 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3912 ASSERT_VK_SUCCESS(err);
3913
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003914 VkImageView ivs[2];
3915 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3916 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003917 VkFramebufferCreateInfo fb_info = {};
3918 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3919 fb_info.pNext = NULL;
3920 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003921 // Set mis-matching attachmentCount
3922 fb_info.attachmentCount = 2;
3923 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003924 fb_info.width = 100;
3925 fb_info.height = 100;
3926 fb_info.layers = 1;
3927
3928 VkFramebuffer fb;
3929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
3935 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003936
3937 // Create a renderPass with a depth-stencil attachment created with
3938 // IMAGE_USAGE_COLOR_ATTACHMENT
3939 // Add our color attachment to pDepthStencilAttachment
3940 subpass.pDepthStencilAttachment = &attach;
3941 subpass.pColorAttachments = NULL;
3942 VkRenderPass rp_ds;
3943 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3944 ASSERT_VK_SUCCESS(err);
3945 // Set correct attachment count, but attachment has COLOR usage bit set
3946 fb_info.attachmentCount = 1;
3947 fb_info.renderPass = rp_ds;
3948
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003950 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3951
3952 m_errorMonitor->VerifyFound();
3953 if (err == VK_SUCCESS) {
3954 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3955 }
3956 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003957
3958 // Create new renderpass with alternate attachment format from fb
3959 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3960 subpass.pDepthStencilAttachment = NULL;
3961 subpass.pColorAttachments = &attach;
3962 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3963 ASSERT_VK_SUCCESS(err);
3964
3965 // Cause error due to mis-matched formats between rp & fb
3966 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3967 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3969 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003970 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3971
3972 m_errorMonitor->VerifyFound();
3973 if (err == VK_SUCCESS) {
3974 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3975 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003976 vkDestroyRenderPass(m_device->device(), rp, NULL);
3977
3978 // Create new renderpass with alternate sample count from fb
3979 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3980 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3981 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3982 ASSERT_VK_SUCCESS(err);
3983
3984 // Cause error due to mis-matched sample count between rp & fb
3985 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003987 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003988 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3989
3990 m_errorMonitor->VerifyFound();
3991 if (err == VK_SUCCESS) {
3992 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3993 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003994
3995 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003996
3997 // Create a custom imageView with non-1 mip levels
3998 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003999 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004000 ASSERT_TRUE(image.initialized());
4001
4002 VkImageView view;
4003 VkImageViewCreateInfo ivci = {};
4004 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4005 ivci.image = image.handle();
4006 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4007 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4008 ivci.subresourceRange.layerCount = 1;
4009 ivci.subresourceRange.baseMipLevel = 0;
4010 // Set level count 2 (only 1 is allowed for FB attachment)
4011 ivci.subresourceRange.levelCount = 2;
4012 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4013 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4014 ASSERT_VK_SUCCESS(err);
4015 // 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);
4019
4020 fb_info.renderPass = rp;
4021 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004023 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 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004029 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004030 // Update view to original color buffer and grow FB dimensions too big
4031 fb_info.pAttachments = ivs;
4032 fb_info.height = 1024;
4033 fb_info.width = 1024;
4034 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004042 // Create view attachment with non-identity swizzle
4043 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4044 ivci.image = image.handle();
4045 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4046 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4047 ivci.subresourceRange.layerCount = 1;
4048 ivci.subresourceRange.baseMipLevel = 0;
4049 ivci.subresourceRange.levelCount = 1;
4050 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4051 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4052 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4053 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4054 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4055 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4056 ASSERT_VK_SUCCESS(err);
4057
4058 fb_info.pAttachments = &view;
4059 fb_info.height = 100;
4060 fb_info.width = 100;
4061 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004062 m_errorMonitor->SetDesiredFailureMsg(
4063 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4064 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004065 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4066
4067 m_errorMonitor->VerifyFound();
4068 if (err == VK_SUCCESS) {
4069 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4070 }
4071 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004072 // reset attachment to color attachment
4073 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074
4075 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004076 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004077 fb_info.height = 100;
4078 fb_info.layers = 1;
4079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004080 m_errorMonitor->SetDesiredFailureMsg(
4081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004082 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4083 "Here are the respective dimensions for attachment");
4084
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max height
4093 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004095 fb_info.layers = 1;
4096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
4107
4108 // Request fb that exceeds max layers
4109 fb_info.width = 100;
4110 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004111 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004113 m_errorMonitor->SetDesiredFailureMsg(
4114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004115 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4116 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004117 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4118
4119 m_errorMonitor->VerifyFound();
4120 if (err == VK_SUCCESS) {
4121 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4122 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004123
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004124 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004125}
4126
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004127TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004128 TEST_DESCRIPTION(
4129 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4130 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004131
Tony Barbour1fa09702017-03-16 12:09:08 -06004132 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4135 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004136 m_errorMonitor->VerifyFound();
4137}
4138
4139TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004140 TEST_DESCRIPTION(
4141 "Run a simple draw calls to validate failure when Line Width dynamic "
4142 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004143
Tony Barbour1fa09702017-03-16 12:09:08 -06004144 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004145 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4147 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004148 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004149}
4150
4151TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004152 TEST_DESCRIPTION(
4153 "Run a simple draw calls to validate failure when Viewport dynamic "
4154 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004155
Tony Barbour1fa09702017-03-16 12:09:08 -06004156 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004157 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4159 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004161 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004162}
4163
4164TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004165 TEST_DESCRIPTION(
4166 "Run a simple draw calls to validate failure when Scissor dynamic "
4167 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004168
Tony Barbour1fa09702017-03-16 12:09:08 -06004169 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004170 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4172 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004173 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004174 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175}
4176
Cortd713fe82016-07-27 09:51:27 -07004177TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004178 TEST_DESCRIPTION(
4179 "Run a simple draw calls to validate failure when Blend Constants "
4180 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004181
Tony Barbour1fa09702017-03-16 12:09:08 -06004182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004183 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4185 "Dynamic blend constants state not set for this command buffer");
4186 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004187 m_errorMonitor->VerifyFound();
4188}
4189
4190TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004191 TEST_DESCRIPTION(
4192 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4193 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004194
Tony Barbour1fa09702017-03-16 12:09:08 -06004195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004196 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004197 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004198 return;
4199 }
4200 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4202 "Dynamic depth bounds state not set for this command buffer");
4203 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004204 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004205}
4206
4207TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004208 TEST_DESCRIPTION(
4209 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4210 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004211
Tony Barbour1fa09702017-03-16 12:09:08 -06004212 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004213 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4215 "Dynamic stencil read mask state not set for this command buffer");
4216 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004217 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004218}
4219
4220TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004221 TEST_DESCRIPTION(
4222 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4223 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004224
Tony Barbour1fa09702017-03-16 12:09:08 -06004225 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004226 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 "Dynamic stencil write mask state not set for this command buffer");
4229 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004230 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004231}
4232
4233TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004234 TEST_DESCRIPTION(
4235 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4236 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004237
Tony Barbour1fa09702017-03-16 12:09:08 -06004238 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004239 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4241 "Dynamic stencil reference state not set for this command buffer");
4242 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004243 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004244}
4245
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004246TEST_F(VkLayerTest, IndexBufferNotBound) {
4247 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004248
Tony Barbour1fa09702017-03-16 12:09:08 -06004249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4251 "Index buffer object not bound to this command buffer when Indexed ");
4252 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004253 m_errorMonitor->VerifyFound();
4254}
4255
Karl Schultz6addd812016-02-02 17:17:23 -07004256TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4258 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4259 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004260
Tony Barbour1fa09702017-03-16 12:09:08 -06004261 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004262 ASSERT_NO_FATAL_FAILURE(InitViewport());
4263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4264
Karl Schultz6addd812016-02-02 17:17:23 -07004265 // We luck out b/c by default the framework creates CB w/ the
4266 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004267 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004268 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004269 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004270
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271 // Bypass framework since it does the waits automatically
4272 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004273 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004274 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4275 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004276 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004277 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004278 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004279 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004280 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004281 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004282 submit_info.pSignalSemaphores = NULL;
4283
Chris Forbes40028e22016-06-13 09:59:34 +12004284 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004285 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004286 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004287
Karl Schultz6addd812016-02-02 17:17:23 -07004288 // Cause validation error by re-submitting cmd buffer that should only be
4289 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004290 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004291 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004292
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004293 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004294}
4295
Karl Schultz6addd812016-02-02 17:17:23 -07004296TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004297 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004298 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004299
Tony Barbour1fa09702017-03-16 12:09:08 -06004300 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004302
Karl Schultz6addd812016-02-02 17:17:23 -07004303 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4304 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004305 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004306 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004307 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004308
4309 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004310 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4311 ds_pool_ci.pNext = NULL;
4312 ds_pool_ci.flags = 0;
4313 ds_pool_ci.maxSets = 1;
4314 ds_pool_ci.poolSizeCount = 1;
4315 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004316
4317 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004318 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004319 ASSERT_VK_SUCCESS(err);
4320
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004321 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4322 dsl_binding_samp.binding = 0;
4323 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4324 dsl_binding_samp.descriptorCount = 1;
4325 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4326 dsl_binding_samp.pImmutableSamplers = NULL;
4327
4328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4330 ds_layout_ci.pNext = NULL;
4331 ds_layout_ci.bindingCount = 1;
4332 ds_layout_ci.pBindings = &dsl_binding_samp;
4333
4334 VkDescriptorSetLayout ds_layout_samp;
4335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4336 ASSERT_VK_SUCCESS(err);
4337
4338 // Try to allocate 2 sets when pool only has 1 set
4339 VkDescriptorSet descriptor_sets[2];
4340 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4341 VkDescriptorSetAllocateInfo alloc_info = {};
4342 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4343 alloc_info.descriptorSetCount = 2;
4344 alloc_info.descriptorPool = ds_pool;
4345 alloc_info.pSetLayouts = set_layouts;
4346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4347 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4348 m_errorMonitor->VerifyFound();
4349
4350 alloc_info.descriptorSetCount = 1;
4351 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004352 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004353 dsl_binding.binding = 0;
4354 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4355 dsl_binding.descriptorCount = 1;
4356 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4357 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004358
Karl Schultz6addd812016-02-02 17:17:23 -07004359 ds_layout_ci.bindingCount = 1;
4360 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004362 VkDescriptorSetLayout ds_layout_ub;
4363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004364 ASSERT_VK_SUCCESS(err);
4365
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004366 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004367 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004368 alloc_info.pSetLayouts = &ds_layout_ub;
4369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4370 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004372 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004373
Karl Schultz2825ab92016-12-02 08:23:14 -07004374 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004375 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004376 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004377}
4378
Karl Schultz6addd812016-02-02 17:17:23 -07004379TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4380 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004381
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004383
Tony Barbour1fa09702017-03-16 12:09:08 -06004384 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004386
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004387 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004388 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4389 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004390
4391 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004392 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4393 ds_pool_ci.pNext = NULL;
4394 ds_pool_ci.maxSets = 1;
4395 ds_pool_ci.poolSizeCount = 1;
4396 ds_pool_ci.flags = 0;
4397 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4398 // app can only call vkResetDescriptorPool on this pool.;
4399 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004400
4401 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004402 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004403 ASSERT_VK_SUCCESS(err);
4404
4405 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004406 dsl_binding.binding = 0;
4407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4408 dsl_binding.descriptorCount = 1;
4409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4410 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004411
4412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4414 ds_layout_ci.pNext = NULL;
4415 ds_layout_ci.bindingCount = 1;
4416 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
4418 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004419 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420 ASSERT_VK_SUCCESS(err);
4421
4422 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004423 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004424 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004425 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004426 alloc_info.descriptorPool = ds_pool;
4427 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004429 ASSERT_VK_SUCCESS(err);
4430
4431 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004432 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004433
Chia-I Wuf7458c52015-10-26 21:10:41 +08004434 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4435 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004436}
4437
Karl Schultz6addd812016-02-02 17:17:23 -07004438TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004439 // Attempt to clear Descriptor Pool with bad object.
4440 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004441
Tony Barbour1fa09702017-03-16 12:09:08 -06004442 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004444 uint64_t fake_pool_handle = 0xbaad6001;
4445 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4446 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004447 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004448}
4449
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004450TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004451 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4452 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004453 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004454 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004455
4456 uint64_t fake_set_handle = 0xbaad6001;
4457 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004458 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004460
Tony Barbour1fa09702017-03-16 12:09:08 -06004461 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4464 layout_bindings[0].binding = 0;
4465 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4466 layout_bindings[0].descriptorCount = 1;
4467 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4468 layout_bindings[0].pImmutableSamplers = NULL;
4469
4470 VkDescriptorSetLayout descriptor_set_layout;
4471 VkDescriptorSetLayoutCreateInfo dslci = {};
4472 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4473 dslci.pNext = NULL;
4474 dslci.bindingCount = 1;
4475 dslci.pBindings = layout_bindings;
4476 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004477 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004478
4479 VkPipelineLayout pipeline_layout;
4480 VkPipelineLayoutCreateInfo plci = {};
4481 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4482 plci.pNext = NULL;
4483 plci.setLayoutCount = 1;
4484 plci.pSetLayouts = &descriptor_set_layout;
4485 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004486 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004487
Tony Barbour552f6c02016-12-21 14:34:07 -07004488 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004489 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4490 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004491 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004492 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004493 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4494 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004495}
4496
Karl Schultz6addd812016-02-02 17:17:23 -07004497TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004498 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4499 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004500 uint64_t fake_layout_handle = 0xbaad6001;
4501 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004503 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004504 VkPipelineLayout pipeline_layout;
4505 VkPipelineLayoutCreateInfo plci = {};
4506 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4507 plci.pNext = NULL;
4508 plci.setLayoutCount = 1;
4509 plci.pSetLayouts = &bad_layout;
4510 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4511
4512 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004513}
4514
Mark Muellerd4914412016-06-13 17:52:06 -06004515TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004516 TEST_DESCRIPTION(
4517 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4518 "1) A uniform buffer update must have a valid buffer index."
4519 "2) When using an array of descriptors in a single WriteDescriptor,"
4520 " the descriptor types and stageflags must all be the same."
4521 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004522
Mike Weiblena6666382017-01-05 15:16:11 -07004523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004524
Tony Barbour1fa09702017-03-16 12:09:08 -06004525 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004526 VkDescriptorPoolSize ds_type_count[4] = {};
4527 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4528 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004529 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004530 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004531 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004532 ds_type_count[2].descriptorCount = 1;
4533 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4534 ds_type_count[3].descriptorCount = 1;
4535
4536 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4537 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4538 ds_pool_ci.maxSets = 1;
4539 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4540 ds_pool_ci.pPoolSizes = ds_type_count;
4541
4542 VkDescriptorPool ds_pool;
4543 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4544 ASSERT_VK_SUCCESS(err);
4545
Mark Muellerb9896722016-06-16 09:54:29 -06004546 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004547 layout_binding[0].binding = 0;
4548 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4549 layout_binding[0].descriptorCount = 1;
4550 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4551 layout_binding[0].pImmutableSamplers = NULL;
4552
4553 layout_binding[1].binding = 1;
4554 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4555 layout_binding[1].descriptorCount = 1;
4556 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4557 layout_binding[1].pImmutableSamplers = NULL;
4558
4559 VkSamplerCreateInfo sampler_ci = {};
4560 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4561 sampler_ci.pNext = NULL;
4562 sampler_ci.magFilter = VK_FILTER_NEAREST;
4563 sampler_ci.minFilter = VK_FILTER_NEAREST;
4564 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4565 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4566 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4567 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4568 sampler_ci.mipLodBias = 1.0;
4569 sampler_ci.anisotropyEnable = VK_FALSE;
4570 sampler_ci.maxAnisotropy = 1;
4571 sampler_ci.compareEnable = VK_FALSE;
4572 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4573 sampler_ci.minLod = 1.0;
4574 sampler_ci.maxLod = 1.0;
4575 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4576 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4577 VkSampler sampler;
4578
4579 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4580 ASSERT_VK_SUCCESS(err);
4581
4582 layout_binding[2].binding = 2;
4583 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4584 layout_binding[2].descriptorCount = 1;
4585 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4586 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4587
Mark Muellerd4914412016-06-13 17:52:06 -06004588 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4589 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4590 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4591 ds_layout_ci.pBindings = layout_binding;
4592 VkDescriptorSetLayout ds_layout;
4593 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4594 ASSERT_VK_SUCCESS(err);
4595
4596 VkDescriptorSetAllocateInfo alloc_info = {};
4597 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4598 alloc_info.descriptorSetCount = 1;
4599 alloc_info.descriptorPool = ds_pool;
4600 alloc_info.pSetLayouts = &ds_layout;
4601 VkDescriptorSet descriptorSet;
4602 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4603 ASSERT_VK_SUCCESS(err);
4604
4605 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4606 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4607 pipeline_layout_ci.pNext = NULL;
4608 pipeline_layout_ci.setLayoutCount = 1;
4609 pipeline_layout_ci.pSetLayouts = &ds_layout;
4610
4611 VkPipelineLayout pipeline_layout;
4612 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4613 ASSERT_VK_SUCCESS(err);
4614
Mark Mueller5c838ce2016-06-16 09:54:29 -06004615 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004616 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4617 descriptor_write.dstSet = descriptorSet;
4618 descriptor_write.dstBinding = 0;
4619 descriptor_write.descriptorCount = 1;
4620 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4621
Mark Mueller5c838ce2016-06-16 09:54:29 -06004622 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004623 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4624 m_errorMonitor->VerifyFound();
4625
4626 // Create a buffer to update the descriptor with
4627 uint32_t qfi = 0;
4628 VkBufferCreateInfo buffCI = {};
4629 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4630 buffCI.size = 1024;
4631 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4632 buffCI.queueFamilyIndexCount = 1;
4633 buffCI.pQueueFamilyIndices = &qfi;
4634
4635 VkBuffer dyub;
4636 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4637 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004638
Tony Barboure132c5f2016-12-12 11:50:20 -07004639 VkDeviceMemory mem;
4640 VkMemoryRequirements mem_reqs;
4641 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4642
4643 VkMemoryAllocateInfo mem_alloc_info = {};
4644 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4645 mem_alloc_info.allocationSize = mem_reqs.size;
4646 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4647 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4648 ASSERT_VK_SUCCESS(err);
4649
4650 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4651 ASSERT_VK_SUCCESS(err);
4652
4653 VkDescriptorBufferInfo buffInfo[2] = {};
4654 buffInfo[0].buffer = dyub;
4655 buffInfo[0].offset = 0;
4656 buffInfo[0].range = 1024;
4657 buffInfo[1].buffer = dyub;
4658 buffInfo[1].offset = 0;
4659 buffInfo[1].range = 1024;
4660 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004661 descriptor_write.descriptorCount = 2;
4662
Mark Mueller5c838ce2016-06-16 09:54:29 -06004663 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4666 m_errorMonitor->VerifyFound();
4667
Mark Mueller5c838ce2016-06-16 09:54:29 -06004668 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4669 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004670 descriptor_write.dstBinding = 1;
4671 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004672
Mark Mueller5c838ce2016-06-16 09:54:29 -06004673 // Make pImageInfo index non-null to avoid complaints of it missing
4674 VkDescriptorImageInfo imageInfo = {};
4675 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4676 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004678 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4679 m_errorMonitor->VerifyFound();
4680
Mark Muellerd4914412016-06-13 17:52:06 -06004681 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004682 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004683 vkDestroySampler(m_device->device(), sampler, NULL);
4684 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4685 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4686 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4687}
4688
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004689TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004690 TEST_DESCRIPTION(
4691 "Attempt to draw with a command buffer that is invalid "
4692 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004693 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004694
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004695 VkBuffer buffer;
4696 VkDeviceMemory mem;
4697 VkMemoryRequirements mem_reqs;
4698
4699 VkBufferCreateInfo buf_info = {};
4700 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004701 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004702 buf_info.size = 256;
4703 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4704 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4705 ASSERT_VK_SUCCESS(err);
4706
4707 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4708
4709 VkMemoryAllocateInfo alloc_info = {};
4710 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4711 alloc_info.allocationSize = 256;
4712 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004713 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 -06004714 if (!pass) {
4715 vkDestroyBuffer(m_device->device(), buffer, NULL);
4716 return;
4717 }
4718 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4719 ASSERT_VK_SUCCESS(err);
4720
4721 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4722 ASSERT_VK_SUCCESS(err);
4723
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004725 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004726 m_commandBuffer->EndCommandBuffer();
4727
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004729 // Destroy buffer dependency prior to submit to cause ERROR
4730 vkDestroyBuffer(m_device->device(), buffer, NULL);
4731
4732 VkSubmitInfo submit_info = {};
4733 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4734 submit_info.commandBufferCount = 1;
4735 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4736 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4737
4738 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004739 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004740 vkFreeMemory(m_device->handle(), mem, NULL);
4741}
4742
Tobin Ehlisea413442016-09-28 10:23:59 -06004743TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4744 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4745
Tony Barbour1fa09702017-03-16 12:09:08 -06004746 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4748
4749 VkDescriptorPoolSize ds_type_count;
4750 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4751 ds_type_count.descriptorCount = 1;
4752
4753 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4754 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4755 ds_pool_ci.maxSets = 1;
4756 ds_pool_ci.poolSizeCount = 1;
4757 ds_pool_ci.pPoolSizes = &ds_type_count;
4758
4759 VkDescriptorPool ds_pool;
4760 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4761 ASSERT_VK_SUCCESS(err);
4762
4763 VkDescriptorSetLayoutBinding layout_binding;
4764 layout_binding.binding = 0;
4765 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4766 layout_binding.descriptorCount = 1;
4767 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4768 layout_binding.pImmutableSamplers = NULL;
4769
4770 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4771 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4772 ds_layout_ci.bindingCount = 1;
4773 ds_layout_ci.pBindings = &layout_binding;
4774 VkDescriptorSetLayout ds_layout;
4775 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4776 ASSERT_VK_SUCCESS(err);
4777
4778 VkDescriptorSetAllocateInfo alloc_info = {};
4779 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4780 alloc_info.descriptorSetCount = 1;
4781 alloc_info.descriptorPool = ds_pool;
4782 alloc_info.pSetLayouts = &ds_layout;
4783 VkDescriptorSet descriptor_set;
4784 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4785 ASSERT_VK_SUCCESS(err);
4786
4787 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4788 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4789 pipeline_layout_ci.pNext = NULL;
4790 pipeline_layout_ci.setLayoutCount = 1;
4791 pipeline_layout_ci.pSetLayouts = &ds_layout;
4792
4793 VkPipelineLayout pipeline_layout;
4794 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4795 ASSERT_VK_SUCCESS(err);
4796
4797 VkBuffer buffer;
4798 uint32_t queue_family_index = 0;
4799 VkBufferCreateInfo buffer_create_info = {};
4800 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4801 buffer_create_info.size = 1024;
4802 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4803 buffer_create_info.queueFamilyIndexCount = 1;
4804 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4805
4806 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4807 ASSERT_VK_SUCCESS(err);
4808
4809 VkMemoryRequirements memory_reqs;
4810 VkDeviceMemory buffer_memory;
4811
4812 VkMemoryAllocateInfo memory_info = {};
4813 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4814 memory_info.allocationSize = 0;
4815 memory_info.memoryTypeIndex = 0;
4816
4817 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4818 memory_info.allocationSize = memory_reqs.size;
4819 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4820 ASSERT_TRUE(pass);
4821
4822 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4823 ASSERT_VK_SUCCESS(err);
4824 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4825 ASSERT_VK_SUCCESS(err);
4826
4827 VkBufferView view;
4828 VkBufferViewCreateInfo bvci = {};
4829 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4830 bvci.buffer = buffer;
4831 bvci.format = VK_FORMAT_R8_UNORM;
4832 bvci.range = VK_WHOLE_SIZE;
4833
4834 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4835 ASSERT_VK_SUCCESS(err);
4836
4837 VkWriteDescriptorSet descriptor_write = {};
4838 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4839 descriptor_write.dstSet = descriptor_set;
4840 descriptor_write.dstBinding = 0;
4841 descriptor_write.descriptorCount = 1;
4842 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4843 descriptor_write.pTexelBufferView = &view;
4844
4845 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004847 char const *vsSource =
4848 "#version 450\n"
4849 "\n"
4850 "out gl_PerVertex { \n"
4851 " vec4 gl_Position;\n"
4852 "};\n"
4853 "void main(){\n"
4854 " gl_Position = vec4(1);\n"
4855 "}\n";
4856 char const *fsSource =
4857 "#version 450\n"
4858 "\n"
4859 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4860 "layout(location=0) out vec4 x;\n"
4861 "void main(){\n"
4862 " x = imageLoad(s, 0);\n"
4863 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4865 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4866 VkPipelineObj pipe(m_device);
4867 pipe.AddShader(&vs);
4868 pipe.AddShader(&fs);
4869 pipe.AddColorAttachment();
4870 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4871
Tobin Ehlisea413442016-09-28 10:23:59 -06004872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4873
Tony Barbour552f6c02016-12-21 14:34:07 -07004874 m_commandBuffer->BeginCommandBuffer();
4875 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4876
Tobin Ehlisea413442016-09-28 10:23:59 -06004877 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4878 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4879 VkRect2D scissor = {{0, 0}, {16, 16}};
4880 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4881 // Bind pipeline to cmd buffer
4882 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4883 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4884 &descriptor_set, 0, nullptr);
4885 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004886 m_commandBuffer->EndRenderPass();
4887 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004888
4889 // Delete BufferView in order to invalidate cmd buffer
4890 vkDestroyBufferView(m_device->device(), view, NULL);
4891 // Now attempt submit of cmd buffer
4892 VkSubmitInfo submit_info = {};
4893 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4894 submit_info.commandBufferCount = 1;
4895 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4896 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4897 m_errorMonitor->VerifyFound();
4898
4899 // Clean-up
4900 vkDestroyBuffer(m_device->device(), buffer, NULL);
4901 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4902 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4903 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4904 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4905}
4906
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004907TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004908 TEST_DESCRIPTION(
4909 "Attempt to draw with a command buffer that is invalid "
4910 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004911 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912
4913 VkImage image;
4914 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4915 VkImageCreateInfo image_create_info = {};
4916 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4917 image_create_info.pNext = NULL;
4918 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4919 image_create_info.format = tex_format;
4920 image_create_info.extent.width = 32;
4921 image_create_info.extent.height = 32;
4922 image_create_info.extent.depth = 1;
4923 image_create_info.mipLevels = 1;
4924 image_create_info.arrayLayers = 1;
4925 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4926 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004927 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004928 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004929 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004931 // Have to bind memory to image before recording cmd in cmd buffer using it
4932 VkMemoryRequirements mem_reqs;
4933 VkDeviceMemory image_mem;
4934 bool pass;
4935 VkMemoryAllocateInfo mem_alloc = {};
4936 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4937 mem_alloc.pNext = NULL;
4938 mem_alloc.memoryTypeIndex = 0;
4939 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4940 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004941 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004942 ASSERT_TRUE(pass);
4943 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4944 ASSERT_VK_SUCCESS(err);
4945 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4946 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004947
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004949 VkClearColorValue ccv;
4950 ccv.float32[0] = 1.0f;
4951 ccv.float32[1] = 1.0f;
4952 ccv.float32[2] = 1.0f;
4953 ccv.float32[3] = 1.0f;
4954 VkImageSubresourceRange isr = {};
4955 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004956 isr.baseArrayLayer = 0;
4957 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004958 isr.layerCount = 1;
4959 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004960 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004961 m_commandBuffer->EndCommandBuffer();
4962
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004964 // Destroy image dependency prior to submit to cause ERROR
4965 vkDestroyImage(m_device->device(), image, NULL);
4966
4967 VkSubmitInfo submit_info = {};
4968 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4969 submit_info.commandBufferCount = 1;
4970 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4971 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4972
4973 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004974 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004975}
4976
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004977TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004978 TEST_DESCRIPTION(
4979 "Attempt to draw with a command buffer that is invalid "
4980 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004981 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004982 VkFormatProperties format_properties;
4983 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004984 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4985 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004986 return;
4987 }
4988
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004989 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4990
4991 VkImageCreateInfo image_ci = {};
4992 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4993 image_ci.pNext = NULL;
4994 image_ci.imageType = VK_IMAGE_TYPE_2D;
4995 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4996 image_ci.extent.width = 32;
4997 image_ci.extent.height = 32;
4998 image_ci.extent.depth = 1;
4999 image_ci.mipLevels = 1;
5000 image_ci.arrayLayers = 1;
5001 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5002 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5005 image_ci.flags = 0;
5006 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005007 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005008
5009 VkMemoryRequirements memory_reqs;
5010 VkDeviceMemory image_memory;
5011 bool pass;
5012 VkMemoryAllocateInfo memory_info = {};
5013 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5014 memory_info.pNext = NULL;
5015 memory_info.allocationSize = 0;
5016 memory_info.memoryTypeIndex = 0;
5017 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5018 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005019 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005020 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005021 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005022 ASSERT_VK_SUCCESS(err);
5023 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5024 ASSERT_VK_SUCCESS(err);
5025
5026 VkImageViewCreateInfo ivci = {
5027 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5028 nullptr,
5029 0,
5030 image,
5031 VK_IMAGE_VIEW_TYPE_2D,
5032 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5035 };
5036 VkImageView view;
5037 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5038 ASSERT_VK_SUCCESS(err);
5039
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005040 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005041 VkFramebuffer fb;
5042 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5043 ASSERT_VK_SUCCESS(err);
5044
5045 // Just use default renderpass with our framebuffer
5046 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005047 m_renderPassBeginInfo.renderArea.extent.width = 32;
5048 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005049 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005050 m_commandBuffer->BeginCommandBuffer();
5051 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5052 m_commandBuffer->EndRenderPass();
5053 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005054 // Destroy image attached to framebuffer to invalidate cmd buffer
5055 vkDestroyImage(m_device->device(), image, NULL);
5056 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005058 QueueCommandBuffer(false);
5059 m_errorMonitor->VerifyFound();
5060
5061 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5062 vkDestroyImageView(m_device->device(), view, nullptr);
5063 vkFreeMemory(m_device->device(), image_memory, nullptr);
5064}
5065
Tobin Ehlisb329f992016-10-12 13:20:29 -06005066TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5067 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005068 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005069 VkFormatProperties format_properties;
5070 VkResult err = VK_SUCCESS;
5071 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5072
Tobin Ehlisb329f992016-10-12 13:20:29 -06005073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5074
5075 VkImageObj image(m_device);
5076 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5077 ASSERT_TRUE(image.initialized());
5078 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5079
5080 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5081 VkFramebuffer fb;
5082 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5083 ASSERT_VK_SUCCESS(err);
5084
5085 // Just use default renderpass with our framebuffer
5086 m_renderPassBeginInfo.framebuffer = fb;
5087 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005088 m_commandBuffer->BeginCommandBuffer();
5089 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5090 m_commandBuffer->EndRenderPass();
5091 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005092 // Submit cmd buffer to put it in-flight
5093 VkSubmitInfo submit_info = {};
5094 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5095 submit_info.commandBufferCount = 1;
5096 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5097 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5098 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005100 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5101 m_errorMonitor->VerifyFound();
5102 // Wait for queue to complete so we can safely destroy everything
5103 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005104 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5105 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005106 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5107}
5108
Tobin Ehlis88becd72016-09-21 14:33:41 -06005109TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5110 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005111 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005112 VkFormatProperties format_properties;
5113 VkResult err = VK_SUCCESS;
5114 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115
Tobin Ehlis88becd72016-09-21 14:33:41 -06005116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5117
5118 VkImageCreateInfo image_ci = {};
5119 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5120 image_ci.pNext = NULL;
5121 image_ci.imageType = VK_IMAGE_TYPE_2D;
5122 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5123 image_ci.extent.width = 256;
5124 image_ci.extent.height = 256;
5125 image_ci.extent.depth = 1;
5126 image_ci.mipLevels = 1;
5127 image_ci.arrayLayers = 1;
5128 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5129 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005130 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005131 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5132 image_ci.flags = 0;
5133 VkImage image;
5134 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5135
5136 VkMemoryRequirements memory_reqs;
5137 VkDeviceMemory image_memory;
5138 bool pass;
5139 VkMemoryAllocateInfo memory_info = {};
5140 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5141 memory_info.pNext = NULL;
5142 memory_info.allocationSize = 0;
5143 memory_info.memoryTypeIndex = 0;
5144 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5145 memory_info.allocationSize = memory_reqs.size;
5146 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5147 ASSERT_TRUE(pass);
5148 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5149 ASSERT_VK_SUCCESS(err);
5150 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5151 ASSERT_VK_SUCCESS(err);
5152
5153 VkImageViewCreateInfo ivci = {
5154 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5155 nullptr,
5156 0,
5157 image,
5158 VK_IMAGE_VIEW_TYPE_2D,
5159 VK_FORMAT_B8G8R8A8_UNORM,
5160 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5161 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5162 };
5163 VkImageView view;
5164 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5165 ASSERT_VK_SUCCESS(err);
5166
5167 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5168 VkFramebuffer fb;
5169 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5170 ASSERT_VK_SUCCESS(err);
5171
5172 // Just use default renderpass with our framebuffer
5173 m_renderPassBeginInfo.framebuffer = fb;
5174 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005175 m_commandBuffer->BeginCommandBuffer();
5176 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5177 m_commandBuffer->EndRenderPass();
5178 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005179 // Submit cmd buffer to put it (and attached imageView) in-flight
5180 VkSubmitInfo submit_info = {};
5181 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5182 submit_info.commandBufferCount = 1;
5183 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5184 // Submit cmd buffer to put framebuffer and children in-flight
5185 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5186 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005188 vkDestroyImage(m_device->device(), image, NULL);
5189 m_errorMonitor->VerifyFound();
5190 // Wait for queue to complete so we can safely destroy image and other objects
5191 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005192 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5193 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005194 vkDestroyImage(m_device->device(), image, NULL);
5195 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5196 vkDestroyImageView(m_device->device(), view, nullptr);
5197 vkFreeMemory(m_device->device(), image_memory, nullptr);
5198}
5199
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005200TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5201 TEST_DESCRIPTION("Delete in-use renderPass.");
5202
Tony Barbour1fa09702017-03-16 12:09:08 -06005203 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5205
5206 // Create simple renderpass
5207 VkAttachmentReference attach = {};
5208 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5209 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005210 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005211 subpass.pColorAttachments = &attach;
5212 VkRenderPassCreateInfo rpci = {};
5213 rpci.subpassCount = 1;
5214 rpci.pSubpasses = &subpass;
5215 rpci.attachmentCount = 1;
5216 VkAttachmentDescription attach_desc = {};
5217 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5218 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5219 rpci.pAttachments = &attach_desc;
5220 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5221 VkRenderPass rp;
5222 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5223 ASSERT_VK_SUCCESS(err);
5224
5225 // Create a pipeline that uses the given renderpass
5226 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5227 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5228
5229 VkPipelineLayout pipeline_layout;
5230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5231 ASSERT_VK_SUCCESS(err);
5232
5233 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5234 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5235 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005236 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005237 vp_state_ci.pViewports = &vp;
5238 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005239 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005240 vp_state_ci.pScissors = &scissors;
5241
5242 VkPipelineShaderStageCreateInfo shaderStages[2];
5243 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5244
5245 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005246 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 -06005247 // but add it to be able to run on more devices
5248 shaderStages[0] = vs.GetStageCreateInfo();
5249 shaderStages[1] = fs.GetStageCreateInfo();
5250
5251 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5252 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5253
5254 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5255 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5256 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5257
5258 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5259 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5260 rs_ci.rasterizerDiscardEnable = true;
5261 rs_ci.lineWidth = 1.0f;
5262
5263 VkPipelineColorBlendAttachmentState att = {};
5264 att.blendEnable = VK_FALSE;
5265 att.colorWriteMask = 0xf;
5266
5267 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5268 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5269 cb_ci.attachmentCount = 1;
5270 cb_ci.pAttachments = &att;
5271
5272 VkGraphicsPipelineCreateInfo gp_ci = {};
5273 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5274 gp_ci.stageCount = 2;
5275 gp_ci.pStages = shaderStages;
5276 gp_ci.pVertexInputState = &vi_ci;
5277 gp_ci.pInputAssemblyState = &ia_ci;
5278 gp_ci.pViewportState = &vp_state_ci;
5279 gp_ci.pRasterizationState = &rs_ci;
5280 gp_ci.pColorBlendState = &cb_ci;
5281 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5282 gp_ci.layout = pipeline_layout;
5283 gp_ci.renderPass = rp;
5284
5285 VkPipelineCacheCreateInfo pc_ci = {};
5286 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5287
Dave Houlton756e6742017-03-23 14:33:22 -06005288 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005289 VkPipeline pipeline;
5290 VkPipelineCache pipe_cache;
5291 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5292 ASSERT_VK_SUCCESS(err);
5293
5294 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5295 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005296
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005297 // Bind pipeline to cmd buffer, will also bind renderpass
5298 m_commandBuffer->BeginCommandBuffer();
5299 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5300 m_commandBuffer->EndCommandBuffer();
5301
5302 VkSubmitInfo submit_info = {};
5303 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5304 submit_info.commandBufferCount = 1;
5305 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5306 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005307 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005308
5309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5310 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5311 m_errorMonitor->VerifyFound();
5312
5313 // Wait for queue to complete so we can safely destroy everything
5314 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005315 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5316 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005317 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5318 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5319 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5320 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5321}
5322
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005323TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005324 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326
5327 VkImage image;
5328 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5329 VkImageCreateInfo image_create_info = {};
5330 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5331 image_create_info.pNext = NULL;
5332 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5333 image_create_info.format = tex_format;
5334 image_create_info.extent.width = 32;
5335 image_create_info.extent.height = 32;
5336 image_create_info.extent.depth = 1;
5337 image_create_info.mipLevels = 1;
5338 image_create_info.arrayLayers = 1;
5339 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5340 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005341 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005342 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005343 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005344 ASSERT_VK_SUCCESS(err);
5345 // Have to bind memory to image before recording cmd in cmd buffer using it
5346 VkMemoryRequirements mem_reqs;
5347 VkDeviceMemory image_mem;
5348 bool pass;
5349 VkMemoryAllocateInfo mem_alloc = {};
5350 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5351 mem_alloc.pNext = NULL;
5352 mem_alloc.memoryTypeIndex = 0;
5353 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5354 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005355 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005356 ASSERT_TRUE(pass);
5357 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5358 ASSERT_VK_SUCCESS(err);
5359
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005360 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005362 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005363
5364 m_commandBuffer->BeginCommandBuffer();
5365 VkClearColorValue ccv;
5366 ccv.float32[0] = 1.0f;
5367 ccv.float32[1] = 1.0f;
5368 ccv.float32[2] = 1.0f;
5369 ccv.float32[3] = 1.0f;
5370 VkImageSubresourceRange isr = {};
5371 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5372 isr.baseArrayLayer = 0;
5373 isr.baseMipLevel = 0;
5374 isr.layerCount = 1;
5375 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005376 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005377 m_commandBuffer->EndCommandBuffer();
5378
5379 m_errorMonitor->VerifyFound();
5380 vkDestroyImage(m_device->device(), image, NULL);
5381 vkFreeMemory(m_device->device(), image_mem, nullptr);
5382}
5383
5384TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005385 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005386 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005387
5388 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005389 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005390 VK_IMAGE_TILING_OPTIMAL, 0);
5391 ASSERT_TRUE(image.initialized());
5392
5393 VkBuffer buffer;
5394 VkDeviceMemory mem;
5395 VkMemoryRequirements mem_reqs;
5396
5397 VkBufferCreateInfo buf_info = {};
5398 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005399 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005400 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005401 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5402 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5403 ASSERT_VK_SUCCESS(err);
5404
5405 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5406
5407 VkMemoryAllocateInfo alloc_info = {};
5408 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005409 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005410 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005411 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 -06005412 if (!pass) {
5413 vkDestroyBuffer(m_device->device(), buffer, NULL);
5414 return;
5415 }
5416 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5417 ASSERT_VK_SUCCESS(err);
5418
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005419 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005421 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005422 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005423 region.bufferRowLength = 16;
5424 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005425 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5426
5427 region.imageSubresource.layerCount = 1;
5428 region.imageExtent.height = 4;
5429 region.imageExtent.width = 4;
5430 region.imageExtent.depth = 1;
5431 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005432 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5433 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005434 m_commandBuffer->EndCommandBuffer();
5435
5436 m_errorMonitor->VerifyFound();
5437
5438 vkDestroyBuffer(m_device->device(), buffer, NULL);
5439 vkFreeMemory(m_device->handle(), mem, NULL);
5440}
5441
Tobin Ehlis85940f52016-07-07 16:57:21 -06005442TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005443 TEST_DESCRIPTION(
5444 "Attempt to draw with a command buffer that is invalid "
5445 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005446 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005447
5448 VkEvent event;
5449 VkEventCreateInfo evci = {};
5450 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5451 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5452 ASSERT_VK_SUCCESS(result);
5453
5454 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005455 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005456 m_commandBuffer->EndCommandBuffer();
5457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005459 // Destroy event dependency prior to submit to cause ERROR
5460 vkDestroyEvent(m_device->device(), event, NULL);
5461
5462 VkSubmitInfo submit_info = {};
5463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5464 submit_info.commandBufferCount = 1;
5465 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5466 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5467
5468 m_errorMonitor->VerifyFound();
5469}
5470
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005471TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005472 TEST_DESCRIPTION(
5473 "Attempt to draw with a command buffer that is invalid "
5474 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005475 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005476
5477 VkQueryPool query_pool;
5478 VkQueryPoolCreateInfo qpci{};
5479 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5480 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5481 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005482 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005483 ASSERT_VK_SUCCESS(result);
5484
5485 m_commandBuffer->BeginCommandBuffer();
5486 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5487 m_commandBuffer->EndCommandBuffer();
5488
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005490 // Destroy query pool dependency prior to submit to cause ERROR
5491 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5492
5493 VkSubmitInfo submit_info = {};
5494 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5495 submit_info.commandBufferCount = 1;
5496 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5497 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5498
5499 m_errorMonitor->VerifyFound();
5500}
5501
Tobin Ehlis24130d92016-07-08 15:50:53 -06005502TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005503 TEST_DESCRIPTION(
5504 "Attempt to draw with a command buffer that is invalid "
5505 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005506 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5508
5509 VkResult err;
5510
5511 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5512 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5513
5514 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005515 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005516 ASSERT_VK_SUCCESS(err);
5517
5518 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5519 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5520 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005521 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005522 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005523 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005524 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005525 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005526
5527 VkPipelineShaderStageCreateInfo shaderStages[2];
5528 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5529
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005530 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005531 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 -06005532 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005533 shaderStages[0] = vs.GetStageCreateInfo();
5534 shaderStages[1] = fs.GetStageCreateInfo();
5535
5536 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5537 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5538
5539 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5540 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5541 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5542
5543 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5544 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005545 rs_ci.rasterizerDiscardEnable = true;
5546 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005547
5548 VkPipelineColorBlendAttachmentState att = {};
5549 att.blendEnable = VK_FALSE;
5550 att.colorWriteMask = 0xf;
5551
5552 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5553 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5554 cb_ci.attachmentCount = 1;
5555 cb_ci.pAttachments = &att;
5556
5557 VkGraphicsPipelineCreateInfo gp_ci = {};
5558 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5559 gp_ci.stageCount = 2;
5560 gp_ci.pStages = shaderStages;
5561 gp_ci.pVertexInputState = &vi_ci;
5562 gp_ci.pInputAssemblyState = &ia_ci;
5563 gp_ci.pViewportState = &vp_state_ci;
5564 gp_ci.pRasterizationState = &rs_ci;
5565 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005566 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5567 gp_ci.layout = pipeline_layout;
5568 gp_ci.renderPass = renderPass();
5569
5570 VkPipelineCacheCreateInfo pc_ci = {};
5571 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5572
5573 VkPipeline pipeline;
5574 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005575 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005576 ASSERT_VK_SUCCESS(err);
5577
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005578 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005579 ASSERT_VK_SUCCESS(err);
5580
5581 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005582 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005583 m_commandBuffer->EndCommandBuffer();
5584 // Now destroy pipeline in order to cause error when submitting
5585 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5586
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005588
5589 VkSubmitInfo submit_info = {};
5590 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5591 submit_info.commandBufferCount = 1;
5592 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5593 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5594
5595 m_errorMonitor->VerifyFound();
5596 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5597 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5598}
5599
Tobin Ehlis31289162016-08-17 14:57:58 -06005600TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005601 TEST_DESCRIPTION(
5602 "Attempt to draw with a command buffer that is invalid "
5603 "due to a bound descriptor set with a buffer dependency "
5604 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_NO_FATAL_FAILURE(InitViewport());
5607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5608
5609 VkDescriptorPoolSize ds_type_count = {};
5610 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 ds_type_count.descriptorCount = 1;
5612
5613 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5614 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5615 ds_pool_ci.pNext = NULL;
5616 ds_pool_ci.maxSets = 1;
5617 ds_pool_ci.poolSizeCount = 1;
5618 ds_pool_ci.pPoolSizes = &ds_type_count;
5619
5620 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSetLayoutBinding dsl_binding = {};
5625 dsl_binding.binding = 0;
5626 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5627 dsl_binding.descriptorCount = 1;
5628 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5629 dsl_binding.pImmutableSamplers = NULL;
5630
5631 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5632 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5633 ds_layout_ci.pNext = NULL;
5634 ds_layout_ci.bindingCount = 1;
5635 ds_layout_ci.pBindings = &dsl_binding;
5636 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005638 ASSERT_VK_SUCCESS(err);
5639
5640 VkDescriptorSet descriptorSet;
5641 VkDescriptorSetAllocateInfo alloc_info = {};
5642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5643 alloc_info.descriptorSetCount = 1;
5644 alloc_info.descriptorPool = ds_pool;
5645 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005646 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005647 ASSERT_VK_SUCCESS(err);
5648
5649 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5650 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5651 pipeline_layout_ci.pNext = NULL;
5652 pipeline_layout_ci.setLayoutCount = 1;
5653 pipeline_layout_ci.pSetLayouts = &ds_layout;
5654
5655 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005656 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005657 ASSERT_VK_SUCCESS(err);
5658
5659 // Create a buffer to update the descriptor with
5660 uint32_t qfi = 0;
5661 VkBufferCreateInfo buffCI = {};
5662 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5663 buffCI.size = 1024;
5664 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5665 buffCI.queueFamilyIndexCount = 1;
5666 buffCI.pQueueFamilyIndices = &qfi;
5667
5668 VkBuffer buffer;
5669 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5670 ASSERT_VK_SUCCESS(err);
5671 // Allocate memory and bind to buffer so we can make it to the appropriate
5672 // error
5673 VkMemoryAllocateInfo mem_alloc = {};
5674 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5675 mem_alloc.pNext = NULL;
5676 mem_alloc.allocationSize = 1024;
5677 mem_alloc.memoryTypeIndex = 0;
5678
5679 VkMemoryRequirements memReqs;
5680 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005681 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005682 if (!pass) {
5683 vkDestroyBuffer(m_device->device(), buffer, NULL);
5684 return;
5685 }
5686
5687 VkDeviceMemory mem;
5688 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5689 ASSERT_VK_SUCCESS(err);
5690 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5691 ASSERT_VK_SUCCESS(err);
5692 // Correctly update descriptor to avoid "NOT_UPDATED" error
5693 VkDescriptorBufferInfo buffInfo = {};
5694 buffInfo.buffer = buffer;
5695 buffInfo.offset = 0;
5696 buffInfo.range = 1024;
5697
5698 VkWriteDescriptorSet descriptor_write;
5699 memset(&descriptor_write, 0, sizeof(descriptor_write));
5700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5701 descriptor_write.dstSet = descriptorSet;
5702 descriptor_write.dstBinding = 0;
5703 descriptor_write.descriptorCount = 1;
5704 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5705 descriptor_write.pBufferInfo = &buffInfo;
5706
5707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5708
5709 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005710 char const *vsSource =
5711 "#version 450\n"
5712 "\n"
5713 "out gl_PerVertex { \n"
5714 " vec4 gl_Position;\n"
5715 "};\n"
5716 "void main(){\n"
5717 " gl_Position = vec4(1);\n"
5718 "}\n";
5719 char const *fsSource =
5720 "#version 450\n"
5721 "\n"
5722 "layout(location=0) out vec4 x;\n"
5723 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5724 "void main(){\n"
5725 " x = vec4(bar.y);\n"
5726 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005727 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5728 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5729 VkPipelineObj pipe(m_device);
5730 pipe.AddShader(&vs);
5731 pipe.AddShader(&fs);
5732 pipe.AddColorAttachment();
5733 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5734
Tony Barbour552f6c02016-12-21 14:34:07 -07005735 m_commandBuffer->BeginCommandBuffer();
5736 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005737 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5738 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5739 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005740
5741 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5742 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5743
Tobin Ehlis31289162016-08-17 14:57:58 -06005744 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005745 m_commandBuffer->EndRenderPass();
5746 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005748 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5749 vkDestroyBuffer(m_device->device(), buffer, NULL);
5750 // Attempt to submit cmd buffer
5751 VkSubmitInfo submit_info = {};
5752 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5753 submit_info.commandBufferCount = 1;
5754 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5755 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5756 m_errorMonitor->VerifyFound();
5757 // Cleanup
5758 vkFreeMemory(m_device->device(), mem, NULL);
5759
5760 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5761 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5762 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5763}
5764
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005765TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005766 TEST_DESCRIPTION(
5767 "Attempt to draw with a command buffer that is invalid "
5768 "due to a bound descriptor sets with a combined image "
5769 "sampler having their image, sampler, and descriptor set "
5770 "each respectively destroyed and then attempting to "
5771 "submit associated cmd buffers. Attempt to destroy a "
5772 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005773 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005774 ASSERT_NO_FATAL_FAILURE(InitViewport());
5775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5776
5777 VkDescriptorPoolSize ds_type_count = {};
5778 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5779 ds_type_count.descriptorCount = 1;
5780
5781 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5782 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5783 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005784 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005785 ds_pool_ci.maxSets = 1;
5786 ds_pool_ci.poolSizeCount = 1;
5787 ds_pool_ci.pPoolSizes = &ds_type_count;
5788
5789 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSetLayoutBinding dsl_binding = {};
5794 dsl_binding.binding = 0;
5795 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5796 dsl_binding.descriptorCount = 1;
5797 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5798 dsl_binding.pImmutableSamplers = NULL;
5799
5800 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5801 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5802 ds_layout_ci.pNext = NULL;
5803 ds_layout_ci.bindingCount = 1;
5804 ds_layout_ci.pBindings = &dsl_binding;
5805 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005806 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005807 ASSERT_VK_SUCCESS(err);
5808
5809 VkDescriptorSet descriptorSet;
5810 VkDescriptorSetAllocateInfo alloc_info = {};
5811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5812 alloc_info.descriptorSetCount = 1;
5813 alloc_info.descriptorPool = ds_pool;
5814 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005816 ASSERT_VK_SUCCESS(err);
5817
5818 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5819 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5820 pipeline_layout_ci.pNext = NULL;
5821 pipeline_layout_ci.setLayoutCount = 1;
5822 pipeline_layout_ci.pSetLayouts = &ds_layout;
5823
5824 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005825 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005826 ASSERT_VK_SUCCESS(err);
5827
5828 // Create images to update the descriptor with
5829 VkImage image;
5830 VkImage image2;
5831 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5832 const int32_t tex_width = 32;
5833 const int32_t tex_height = 32;
5834 VkImageCreateInfo image_create_info = {};
5835 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5836 image_create_info.pNext = NULL;
5837 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5838 image_create_info.format = tex_format;
5839 image_create_info.extent.width = tex_width;
5840 image_create_info.extent.height = tex_height;
5841 image_create_info.extent.depth = 1;
5842 image_create_info.mipLevels = 1;
5843 image_create_info.arrayLayers = 1;
5844 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5845 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5846 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5847 image_create_info.flags = 0;
5848 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5849 ASSERT_VK_SUCCESS(err);
5850 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5851 ASSERT_VK_SUCCESS(err);
5852
5853 VkMemoryRequirements memory_reqs;
5854 VkDeviceMemory image_memory;
5855 bool pass;
5856 VkMemoryAllocateInfo memory_info = {};
5857 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5858 memory_info.pNext = NULL;
5859 memory_info.allocationSize = 0;
5860 memory_info.memoryTypeIndex = 0;
5861 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5862 // Allocate enough memory for both images
5863 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005864 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005865 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867 ASSERT_VK_SUCCESS(err);
5868 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5869 ASSERT_VK_SUCCESS(err);
5870 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005871 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005872 ASSERT_VK_SUCCESS(err);
5873
5874 VkImageViewCreateInfo image_view_create_info = {};
5875 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5876 image_view_create_info.image = image;
5877 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5878 image_view_create_info.format = tex_format;
5879 image_view_create_info.subresourceRange.layerCount = 1;
5880 image_view_create_info.subresourceRange.baseMipLevel = 0;
5881 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005882 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005883
5884 VkImageView view;
5885 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005886 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005887 ASSERT_VK_SUCCESS(err);
5888 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005889 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005890 ASSERT_VK_SUCCESS(err);
5891 // Create Samplers
5892 VkSamplerCreateInfo sampler_ci = {};
5893 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5894 sampler_ci.pNext = NULL;
5895 sampler_ci.magFilter = VK_FILTER_NEAREST;
5896 sampler_ci.minFilter = VK_FILTER_NEAREST;
5897 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5898 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5899 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5900 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5901 sampler_ci.mipLodBias = 1.0;
5902 sampler_ci.anisotropyEnable = VK_FALSE;
5903 sampler_ci.maxAnisotropy = 1;
5904 sampler_ci.compareEnable = VK_FALSE;
5905 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5906 sampler_ci.minLod = 1.0;
5907 sampler_ci.maxLod = 1.0;
5908 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5909 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5910 VkSampler sampler;
5911 VkSampler sampler2;
5912 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5913 ASSERT_VK_SUCCESS(err);
5914 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5915 ASSERT_VK_SUCCESS(err);
5916 // Update descriptor with image and sampler
5917 VkDescriptorImageInfo img_info = {};
5918 img_info.sampler = sampler;
5919 img_info.imageView = view;
5920 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5921
5922 VkWriteDescriptorSet descriptor_write;
5923 memset(&descriptor_write, 0, sizeof(descriptor_write));
5924 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5925 descriptor_write.dstSet = descriptorSet;
5926 descriptor_write.dstBinding = 0;
5927 descriptor_write.descriptorCount = 1;
5928 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5929 descriptor_write.pImageInfo = &img_info;
5930
5931 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5932
5933 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005934 char const *vsSource =
5935 "#version 450\n"
5936 "\n"
5937 "out gl_PerVertex { \n"
5938 " vec4 gl_Position;\n"
5939 "};\n"
5940 "void main(){\n"
5941 " gl_Position = vec4(1);\n"
5942 "}\n";
5943 char const *fsSource =
5944 "#version 450\n"
5945 "\n"
5946 "layout(set=0, binding=0) uniform sampler2D s;\n"
5947 "layout(location=0) out vec4 x;\n"
5948 "void main(){\n"
5949 " x = texture(s, vec2(1));\n"
5950 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005951 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5952 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5953 VkPipelineObj pipe(m_device);
5954 pipe.AddShader(&vs);
5955 pipe.AddShader(&fs);
5956 pipe.AddColorAttachment();
5957 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5958
5959 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005961 m_commandBuffer->BeginCommandBuffer();
5962 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005963 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5964 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5965 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5967 VkRect2D scissor = {{0, 0}, {16, 16}};
5968 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5969 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005970 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005971 m_commandBuffer->EndRenderPass();
5972 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005973 // Destroy sampler invalidates the cmd buffer, causing error on submit
5974 vkDestroySampler(m_device->device(), sampler, NULL);
5975 // Attempt to submit cmd buffer
5976 VkSubmitInfo submit_info = {};
5977 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5978 submit_info.commandBufferCount = 1;
5979 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5980 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5981 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005982
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 // Now re-update descriptor with valid sampler and delete image
5984 img_info.sampler = sampler2;
5985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005986
5987 VkCommandBufferBeginInfo info = {};
5988 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5989 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5990
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005992 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005993 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005994 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5995 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5996 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005997 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5998 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006000 m_commandBuffer->EndRenderPass();
6001 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006002 // Destroy image invalidates the cmd buffer, causing error on submit
6003 vkDestroyImage(m_device->device(), image, NULL);
6004 // Attempt to submit cmd buffer
6005 submit_info = {};
6006 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6007 submit_info.commandBufferCount = 1;
6008 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6009 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6010 m_errorMonitor->VerifyFound();
6011 // Now update descriptor to be valid, but then free descriptor
6012 img_info.imageView = view2;
6013 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006014 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006015 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006016 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6017 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6018 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006019 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6020 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006021 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006022 m_commandBuffer->EndRenderPass();
6023 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006024 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006025
6026 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006028 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006029 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006030
6031 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006032 // 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 -07006033 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006034 m_errorMonitor->SetUnexpectedError(
6035 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6036 "either be a valid handle or VK_NULL_HANDLE");
6037 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006038 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6039
6040 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006041 submit_info = {};
6042 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6043 submit_info.commandBufferCount = 1;
6044 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006046 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6047 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006048
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006049 // Cleanup
6050 vkFreeMemory(m_device->device(), image_memory, NULL);
6051 vkDestroySampler(m_device->device(), sampler2, NULL);
6052 vkDestroyImage(m_device->device(), image2, NULL);
6053 vkDestroyImageView(m_device->device(), view, NULL);
6054 vkDestroyImageView(m_device->device(), view2, NULL);
6055 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6056 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6057 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6058}
6059
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006060TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6061 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006062 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006063 ASSERT_NO_FATAL_FAILURE(InitViewport());
6064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6065
6066 VkDescriptorPoolSize ds_type_count = {};
6067 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6068 ds_type_count.descriptorCount = 1;
6069
6070 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6071 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6072 ds_pool_ci.pNext = NULL;
6073 ds_pool_ci.maxSets = 1;
6074 ds_pool_ci.poolSizeCount = 1;
6075 ds_pool_ci.pPoolSizes = &ds_type_count;
6076
6077 VkDescriptorPool ds_pool;
6078 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6079 ASSERT_VK_SUCCESS(err);
6080
6081 VkDescriptorSetLayoutBinding dsl_binding = {};
6082 dsl_binding.binding = 0;
6083 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6084 dsl_binding.descriptorCount = 1;
6085 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6086 dsl_binding.pImmutableSamplers = NULL;
6087
6088 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6089 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6090 ds_layout_ci.pNext = NULL;
6091 ds_layout_ci.bindingCount = 1;
6092 ds_layout_ci.pBindings = &dsl_binding;
6093 VkDescriptorSetLayout ds_layout;
6094 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6095 ASSERT_VK_SUCCESS(err);
6096
6097 VkDescriptorSet descriptor_set;
6098 VkDescriptorSetAllocateInfo alloc_info = {};
6099 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6100 alloc_info.descriptorSetCount = 1;
6101 alloc_info.descriptorPool = ds_pool;
6102 alloc_info.pSetLayouts = &ds_layout;
6103 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6104 ASSERT_VK_SUCCESS(err);
6105
6106 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6107 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6108 pipeline_layout_ci.pNext = NULL;
6109 pipeline_layout_ci.setLayoutCount = 1;
6110 pipeline_layout_ci.pSetLayouts = &ds_layout;
6111
6112 VkPipelineLayout pipeline_layout;
6113 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6114 ASSERT_VK_SUCCESS(err);
6115
6116 // Create image to update the descriptor with
6117 VkImageObj image(m_device);
6118 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6119 ASSERT_TRUE(image.initialized());
6120
6121 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6122 // Create Sampler
6123 VkSamplerCreateInfo sampler_ci = {};
6124 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6125 sampler_ci.pNext = NULL;
6126 sampler_ci.magFilter = VK_FILTER_NEAREST;
6127 sampler_ci.minFilter = VK_FILTER_NEAREST;
6128 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6129 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6132 sampler_ci.mipLodBias = 1.0;
6133 sampler_ci.anisotropyEnable = VK_FALSE;
6134 sampler_ci.maxAnisotropy = 1;
6135 sampler_ci.compareEnable = VK_FALSE;
6136 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6137 sampler_ci.minLod = 1.0;
6138 sampler_ci.maxLod = 1.0;
6139 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6140 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6141 VkSampler sampler;
6142 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6143 ASSERT_VK_SUCCESS(err);
6144 // Update descriptor with image and sampler
6145 VkDescriptorImageInfo img_info = {};
6146 img_info.sampler = sampler;
6147 img_info.imageView = view;
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptor_set;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
Tony Barbour552f6c02016-12-21 14:34:07 -07006187 m_commandBuffer->BeginCommandBuffer();
6188 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006189 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6190 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6191 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006192
6193 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6194 VkRect2D scissor = {{0, 0}, {16, 16}};
6195 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6196 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6197
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006198 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006199 m_commandBuffer->EndRenderPass();
6200 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006201 // Submit cmd buffer to put pool in-flight
6202 VkSubmitInfo submit_info = {};
6203 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6204 submit_info.commandBufferCount = 1;
6205 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6206 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6207 // Destroy pool while in-flight, causing error
6208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6209 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6210 m_errorMonitor->VerifyFound();
6211 vkQueueWaitIdle(m_device->m_queue);
6212 // Cleanup
6213 vkDestroySampler(m_device->device(), sampler, NULL);
6214 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6215 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006216 m_errorMonitor->SetUnexpectedError(
6217 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6218 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006219 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006220 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006221}
6222
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006223TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6224 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006225 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006226 ASSERT_NO_FATAL_FAILURE(InitViewport());
6227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6228
6229 VkDescriptorPoolSize ds_type_count = {};
6230 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6231 ds_type_count.descriptorCount = 1;
6232
6233 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6234 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6235 ds_pool_ci.pNext = NULL;
6236 ds_pool_ci.maxSets = 1;
6237 ds_pool_ci.poolSizeCount = 1;
6238 ds_pool_ci.pPoolSizes = &ds_type_count;
6239
6240 VkDescriptorPool ds_pool;
6241 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6242 ASSERT_VK_SUCCESS(err);
6243
6244 VkDescriptorSetLayoutBinding dsl_binding = {};
6245 dsl_binding.binding = 0;
6246 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6247 dsl_binding.descriptorCount = 1;
6248 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6249 dsl_binding.pImmutableSamplers = NULL;
6250
6251 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6252 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6253 ds_layout_ci.pNext = NULL;
6254 ds_layout_ci.bindingCount = 1;
6255 ds_layout_ci.pBindings = &dsl_binding;
6256 VkDescriptorSetLayout ds_layout;
6257 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6258 ASSERT_VK_SUCCESS(err);
6259
6260 VkDescriptorSet descriptorSet;
6261 VkDescriptorSetAllocateInfo alloc_info = {};
6262 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6263 alloc_info.descriptorSetCount = 1;
6264 alloc_info.descriptorPool = ds_pool;
6265 alloc_info.pSetLayouts = &ds_layout;
6266 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6267 ASSERT_VK_SUCCESS(err);
6268
6269 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6270 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6271 pipeline_layout_ci.pNext = NULL;
6272 pipeline_layout_ci.setLayoutCount = 1;
6273 pipeline_layout_ci.pSetLayouts = &ds_layout;
6274
6275 VkPipelineLayout pipeline_layout;
6276 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6277 ASSERT_VK_SUCCESS(err);
6278
6279 // Create images to update the descriptor with
6280 VkImage image;
6281 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6282 const int32_t tex_width = 32;
6283 const int32_t tex_height = 32;
6284 VkImageCreateInfo image_create_info = {};
6285 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6286 image_create_info.pNext = NULL;
6287 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6288 image_create_info.format = tex_format;
6289 image_create_info.extent.width = tex_width;
6290 image_create_info.extent.height = tex_height;
6291 image_create_info.extent.depth = 1;
6292 image_create_info.mipLevels = 1;
6293 image_create_info.arrayLayers = 1;
6294 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6295 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6296 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6297 image_create_info.flags = 0;
6298 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6299 ASSERT_VK_SUCCESS(err);
6300 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6301 VkMemoryRequirements memory_reqs;
6302 VkDeviceMemory image_memory;
6303 bool pass;
6304 VkMemoryAllocateInfo memory_info = {};
6305 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6306 memory_info.pNext = NULL;
6307 memory_info.allocationSize = 0;
6308 memory_info.memoryTypeIndex = 0;
6309 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6310 // Allocate enough memory for image
6311 memory_info.allocationSize = memory_reqs.size;
6312 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6313 ASSERT_TRUE(pass);
6314 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6315 ASSERT_VK_SUCCESS(err);
6316 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6317 ASSERT_VK_SUCCESS(err);
6318
6319 VkImageViewCreateInfo image_view_create_info = {};
6320 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6321 image_view_create_info.image = image;
6322 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6323 image_view_create_info.format = tex_format;
6324 image_view_create_info.subresourceRange.layerCount = 1;
6325 image_view_create_info.subresourceRange.baseMipLevel = 0;
6326 image_view_create_info.subresourceRange.levelCount = 1;
6327 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6328
6329 VkImageView view;
6330 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6331 ASSERT_VK_SUCCESS(err);
6332 // Create Samplers
6333 VkSamplerCreateInfo sampler_ci = {};
6334 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6335 sampler_ci.pNext = NULL;
6336 sampler_ci.magFilter = VK_FILTER_NEAREST;
6337 sampler_ci.minFilter = VK_FILTER_NEAREST;
6338 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6339 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6340 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6341 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6342 sampler_ci.mipLodBias = 1.0;
6343 sampler_ci.anisotropyEnable = VK_FALSE;
6344 sampler_ci.maxAnisotropy = 1;
6345 sampler_ci.compareEnable = VK_FALSE;
6346 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6347 sampler_ci.minLod = 1.0;
6348 sampler_ci.maxLod = 1.0;
6349 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6350 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6351 VkSampler sampler;
6352 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6353 ASSERT_VK_SUCCESS(err);
6354 // Update descriptor with image and sampler
6355 VkDescriptorImageInfo img_info = {};
6356 img_info.sampler = sampler;
6357 img_info.imageView = view;
6358 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6359
6360 VkWriteDescriptorSet descriptor_write;
6361 memset(&descriptor_write, 0, sizeof(descriptor_write));
6362 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6363 descriptor_write.dstSet = descriptorSet;
6364 descriptor_write.dstBinding = 0;
6365 descriptor_write.descriptorCount = 1;
6366 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6367 descriptor_write.pImageInfo = &img_info;
6368 // Break memory binding and attempt update
6369 vkFreeMemory(m_device->device(), image_memory, nullptr);
6370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006371 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6373 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6374 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6375 m_errorMonitor->VerifyFound();
6376 // Cleanup
6377 vkDestroyImage(m_device->device(), image, NULL);
6378 vkDestroySampler(m_device->device(), sampler, NULL);
6379 vkDestroyImageView(m_device->device(), view, NULL);
6380 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6381 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6382 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6383}
6384
Karl Schultz6addd812016-02-02 17:17:23 -07006385TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006386 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6387 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006388 // Create a valid cmd buffer
6389 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006390 uint64_t fake_pipeline_handle = 0xbaad6001;
6391 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006392 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6394
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006396 m_commandBuffer->BeginCommandBuffer();
6397 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006398 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006399 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006400
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006401 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006402 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 -06006403 Draw(1, 0, 0, 0);
6404 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006405
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006406 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006407 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 -07006408 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006409 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6410 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006411}
6412
Karl Schultz6addd812016-02-02 17:17:23 -07006413TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006414 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006415 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006416
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006418
Tony Barbour1fa09702017-03-16 12:09:08 -06006419 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006420 ASSERT_NO_FATAL_FAILURE(InitViewport());
6421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006422 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006423 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6424 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006425
6426 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006427 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6428 ds_pool_ci.pNext = NULL;
6429 ds_pool_ci.maxSets = 1;
6430 ds_pool_ci.poolSizeCount = 1;
6431 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006432
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006433 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006434 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006435 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006436
Tony Barboureb254902015-07-15 12:50:33 -06006437 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006438 dsl_binding.binding = 0;
6439 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6440 dsl_binding.descriptorCount = 1;
6441 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6442 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006443
Tony Barboureb254902015-07-15 12:50:33 -06006444 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006445 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6446 ds_layout_ci.pNext = NULL;
6447 ds_layout_ci.bindingCount = 1;
6448 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006449 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006450 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006451 ASSERT_VK_SUCCESS(err);
6452
6453 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006454 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006455 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006456 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006457 alloc_info.descriptorPool = ds_pool;
6458 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006459 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006460 ASSERT_VK_SUCCESS(err);
6461
Tony Barboureb254902015-07-15 12:50:33 -06006462 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006463 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6464 pipeline_layout_ci.pNext = NULL;
6465 pipeline_layout_ci.setLayoutCount = 1;
6466 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006467
6468 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006469 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006470 ASSERT_VK_SUCCESS(err);
6471
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006472 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006473 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006474 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006475 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006476
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006477 VkPipelineObj pipe(m_device);
6478 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006479 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006480 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006481 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006482
Tony Barbour552f6c02016-12-21 14:34:07 -07006483 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006484 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6486 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006487
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006488 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006489
Chia-I Wuf7458c52015-10-26 21:10:41 +08006490 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6491 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6492 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006493}
6494
Karl Schultz6addd812016-02-02 17:17:23 -07006495TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006496 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006497 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006498
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006500
Tony Barbour1fa09702017-03-16 12:09:08 -06006501 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006502 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006503 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6504 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006505
6506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6508 ds_pool_ci.pNext = NULL;
6509 ds_pool_ci.maxSets = 1;
6510 ds_pool_ci.poolSizeCount = 1;
6511 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512
6513 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006514 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006515 ASSERT_VK_SUCCESS(err);
6516
6517 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006518 dsl_binding.binding = 0;
6519 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6520 dsl_binding.descriptorCount = 1;
6521 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6522 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006523
6524 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006525 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6526 ds_layout_ci.pNext = NULL;
6527 ds_layout_ci.bindingCount = 1;
6528 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006529 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006530 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006531 ASSERT_VK_SUCCESS(err);
6532
6533 VkDescriptorSet descriptorSet;
6534 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006535 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006536 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006537 alloc_info.descriptorPool = ds_pool;
6538 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006539 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006540 ASSERT_VK_SUCCESS(err);
6541
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006542 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006543 VkWriteDescriptorSet descriptor_write;
6544 memset(&descriptor_write, 0, sizeof(descriptor_write));
6545 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6546 descriptor_write.dstSet = descriptorSet;
6547 descriptor_write.dstBinding = 0;
6548 descriptor_write.descriptorCount = 1;
6549 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6550 descriptor_write.pTexelBufferView = &view;
6551
6552 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6553
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006554 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006555
6556 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6557 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6558}
6559
Mark Youngd339ba32016-05-30 13:28:35 -06006560TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006561 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 -06006562
6563 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006565 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006566
Tony Barbour1fa09702017-03-16 12:09:08 -06006567 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006568
6569 // Create a buffer with no bound memory and then attempt to create
6570 // a buffer view.
6571 VkBufferCreateInfo buff_ci = {};
6572 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006573 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006574 buff_ci.size = 256;
6575 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6576 VkBuffer buffer;
6577 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6578 ASSERT_VK_SUCCESS(err);
6579
6580 VkBufferViewCreateInfo buff_view_ci = {};
6581 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6582 buff_view_ci.buffer = buffer;
6583 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6584 buff_view_ci.range = VK_WHOLE_SIZE;
6585 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006586 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006587
6588 m_errorMonitor->VerifyFound();
6589 vkDestroyBuffer(m_device->device(), buffer, NULL);
6590 // If last error is success, it still created the view, so delete it.
6591 if (err == VK_SUCCESS) {
6592 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6593 }
6594}
6595
Karl Schultz6addd812016-02-02 17:17:23 -07006596TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6597 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6598 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006599 // 1. No dynamicOffset supplied
6600 // 2. Too many dynamicOffsets supplied
6601 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006602 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6604 " requires 1 dynamicOffsets, but only "
6605 "0 dynamicOffsets are left in "
6606 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006607
Tony Barbour1fa09702017-03-16 12:09:08 -06006608 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006609 ASSERT_NO_FATAL_FAILURE(InitViewport());
6610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6611
6612 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006613 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6614 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006615
6616 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006617 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6618 ds_pool_ci.pNext = NULL;
6619 ds_pool_ci.maxSets = 1;
6620 ds_pool_ci.poolSizeCount = 1;
6621 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006622
6623 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006624 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006625 ASSERT_VK_SUCCESS(err);
6626
6627 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006628 dsl_binding.binding = 0;
6629 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6630 dsl_binding.descriptorCount = 1;
6631 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6632 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006633
6634 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006635 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6636 ds_layout_ci.pNext = NULL;
6637 ds_layout_ci.bindingCount = 1;
6638 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006639 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006640 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006641 ASSERT_VK_SUCCESS(err);
6642
6643 VkDescriptorSet descriptorSet;
6644 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006645 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006646 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006647 alloc_info.descriptorPool = ds_pool;
6648 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006649 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006650 ASSERT_VK_SUCCESS(err);
6651
6652 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006653 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6654 pipeline_layout_ci.pNext = NULL;
6655 pipeline_layout_ci.setLayoutCount = 1;
6656 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006657
6658 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006659 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006660 ASSERT_VK_SUCCESS(err);
6661
6662 // Create a buffer to update the descriptor with
6663 uint32_t qfi = 0;
6664 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006665 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6666 buffCI.size = 1024;
6667 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6668 buffCI.queueFamilyIndexCount = 1;
6669 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006670
6671 VkBuffer dyub;
6672 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6673 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006674 // Allocate memory and bind to buffer so we can make it to the appropriate
6675 // error
6676 VkMemoryAllocateInfo mem_alloc = {};
6677 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6678 mem_alloc.pNext = NULL;
6679 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006680 mem_alloc.memoryTypeIndex = 0;
6681
6682 VkMemoryRequirements memReqs;
6683 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006684 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006685 if (!pass) {
6686 vkDestroyBuffer(m_device->device(), dyub, NULL);
6687 return;
6688 }
6689
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006690 VkDeviceMemory mem;
6691 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6692 ASSERT_VK_SUCCESS(err);
6693 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6694 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006695 // Correctly update descriptor to avoid "NOT_UPDATED" error
6696 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006697 buffInfo.buffer = dyub;
6698 buffInfo.offset = 0;
6699 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006700
6701 VkWriteDescriptorSet descriptor_write;
6702 memset(&descriptor_write, 0, sizeof(descriptor_write));
6703 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6704 descriptor_write.dstSet = descriptorSet;
6705 descriptor_write.dstBinding = 0;
6706 descriptor_write.descriptorCount = 1;
6707 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6708 descriptor_write.pBufferInfo = &buffInfo;
6709
6710 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6711
Tony Barbour552f6c02016-12-21 14:34:07 -07006712 m_commandBuffer->BeginCommandBuffer();
6713 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006714 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6715 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006716 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006717 uint32_t pDynOff[2] = {512, 756};
6718 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6720 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6721 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6722 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006723 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006724 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6726 " dynamic offset 512 combined with "
6727 "offset 0 and range 1024 that "
6728 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006729 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006730 char const *vsSource =
6731 "#version 450\n"
6732 "\n"
6733 "out gl_PerVertex { \n"
6734 " vec4 gl_Position;\n"
6735 "};\n"
6736 "void main(){\n"
6737 " gl_Position = vec4(1);\n"
6738 "}\n";
6739 char const *fsSource =
6740 "#version 450\n"
6741 "\n"
6742 "layout(location=0) out vec4 x;\n"
6743 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6744 "void main(){\n"
6745 " x = vec4(bar.y);\n"
6746 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6749 VkPipelineObj pipe(m_device);
6750 pipe.AddShader(&vs);
6751 pipe.AddShader(&fs);
6752 pipe.AddColorAttachment();
6753 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6754
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006755 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6756 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6757 VkRect2D scissor = {{0, 0}, {16, 16}};
6758 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6759
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006760 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006761 // This update should succeed, but offset size of 512 will overstep buffer
6762 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006763 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6764 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006765 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006766 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006767
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006768 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006769 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006770
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006772 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6774}
6775
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006776TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006777 TEST_DESCRIPTION(
6778 "Attempt to update a descriptor with a non-sparse buffer "
6779 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006780 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006782 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6784 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006785
Tony Barbour1fa09702017-03-16 12:09:08 -06006786 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006787 ASSERT_NO_FATAL_FAILURE(InitViewport());
6788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6789
6790 VkDescriptorPoolSize ds_type_count = {};
6791 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6792 ds_type_count.descriptorCount = 1;
6793
6794 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6795 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6796 ds_pool_ci.pNext = NULL;
6797 ds_pool_ci.maxSets = 1;
6798 ds_pool_ci.poolSizeCount = 1;
6799 ds_pool_ci.pPoolSizes = &ds_type_count;
6800
6801 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006802 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006803 ASSERT_VK_SUCCESS(err);
6804
6805 VkDescriptorSetLayoutBinding dsl_binding = {};
6806 dsl_binding.binding = 0;
6807 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6808 dsl_binding.descriptorCount = 1;
6809 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6810 dsl_binding.pImmutableSamplers = NULL;
6811
6812 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6813 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6814 ds_layout_ci.pNext = NULL;
6815 ds_layout_ci.bindingCount = 1;
6816 ds_layout_ci.pBindings = &dsl_binding;
6817 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006818 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006819 ASSERT_VK_SUCCESS(err);
6820
6821 VkDescriptorSet descriptorSet;
6822 VkDescriptorSetAllocateInfo alloc_info = {};
6823 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6824 alloc_info.descriptorSetCount = 1;
6825 alloc_info.descriptorPool = ds_pool;
6826 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006827 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006828 ASSERT_VK_SUCCESS(err);
6829
6830 // Create a buffer to update the descriptor with
6831 uint32_t qfi = 0;
6832 VkBufferCreateInfo buffCI = {};
6833 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6834 buffCI.size = 1024;
6835 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6836 buffCI.queueFamilyIndexCount = 1;
6837 buffCI.pQueueFamilyIndices = &qfi;
6838
6839 VkBuffer dyub;
6840 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6841 ASSERT_VK_SUCCESS(err);
6842
6843 // Attempt to update descriptor without binding memory to it
6844 VkDescriptorBufferInfo buffInfo = {};
6845 buffInfo.buffer = dyub;
6846 buffInfo.offset = 0;
6847 buffInfo.range = 1024;
6848
6849 VkWriteDescriptorSet descriptor_write;
6850 memset(&descriptor_write, 0, sizeof(descriptor_write));
6851 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6852 descriptor_write.dstSet = descriptorSet;
6853 descriptor_write.dstBinding = 0;
6854 descriptor_write.descriptorCount = 1;
6855 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6856 descriptor_write.pBufferInfo = &buffInfo;
6857
6858 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6859 m_errorMonitor->VerifyFound();
6860
6861 vkDestroyBuffer(m_device->device(), dyub, NULL);
6862 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6863 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6864}
6865
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006866TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006867 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006868 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006869 ASSERT_NO_FATAL_FAILURE(InitViewport());
6870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6871
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006872 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006873 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006874 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6875 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6876 pipeline_layout_ci.pushConstantRangeCount = 1;
6877 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6878
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006879 //
6880 // Check for invalid push constant ranges in pipeline layouts.
6881 //
6882 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006883 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006884 char const *msg;
6885 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006886
Karl Schultzc81037d2016-05-12 08:11:23 -06006887 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6888 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6889 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6890 "vkCreatePipelineLayout() call has push constants index 0 with "
6891 "size 0."},
6892 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6893 "vkCreatePipelineLayout() call has push constants index 0 with "
6894 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006895 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006896 "vkCreatePipelineLayout() call has push constants index 0 with "
6897 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006898 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006899 "vkCreatePipelineLayout() call has push constants index 0 with "
6900 "size 0."},
6901 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6902 "vkCreatePipelineLayout() call has push constants index 0 with "
6903 "offset 1. Offset must"},
6904 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6905 "vkCreatePipelineLayout() call has push constants index 0 "
6906 "with offset "},
6907 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6908 "vkCreatePipelineLayout() call has push constants "
6909 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006910 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006911 "vkCreatePipelineLayout() call has push constants index 0 "
6912 "with offset "},
6913 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6914 "vkCreatePipelineLayout() call has push "
6915 "constants index 0 with offset "},
6916 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6917 "vkCreatePipelineLayout() call has push "
6918 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006919 }};
6920
6921 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006922 for (const auto &iter : range_tests) {
6923 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6925 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006926 m_errorMonitor->VerifyFound();
6927 if (VK_SUCCESS == err) {
6928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6929 }
6930 }
6931
6932 // Check for invalid stage flag
6933 pc_range.offset = 0;
6934 pc_range.size = 16;
6935 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006936 m_errorMonitor->SetDesiredFailureMsg(
6937 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6938 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006939 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006940 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006941 if (VK_SUCCESS == err) {
6942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6943 }
6944
Karl Schultzc59b72d2017-02-24 15:45:05 -07006945 // Check for duplicate stage flags in a list of push constant ranges.
6946 // A shader can only have one push constant block and that block is mapped
6947 // to the push constant range that has that shader's stage flag set.
6948 // The shader's stage flag can only appear once in all the ranges, so the
6949 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006950 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006951 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006952 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006953 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006954 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006955 // Overlapping ranges are OK, but a stage flag can appear only once.
6956 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6957 {
6958 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6959 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6960 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6961 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006963 {
6964 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6967 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6968 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6969 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6970 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6971 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6972 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6973 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6974 }},
6975 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6976 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6977 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6978 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6979 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6980 {
6981 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6982 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6983 }},
6984 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6985 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6986 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6987 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6988 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6989 {
6990 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6991 }},
6992 },
6993 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006994
Karl Schultzc59b72d2017-02-24 15:45:05 -07006995 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006996 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006997 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006999 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007000 m_errorMonitor->VerifyFound();
7001 if (VK_SUCCESS == err) {
7002 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7003 }
7004 }
7005
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007006 //
7007 // CmdPushConstants tests
7008 //
7009
Karl Schultzc59b72d2017-02-24 15:45:05 -07007010 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007011 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007012 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007013 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007014 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007015 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007016 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007017 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007018
7019 const uint8_t dummy_values[100] = {};
7020
7021 m_commandBuffer->BeginCommandBuffer();
7022 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007023
7024 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007025 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007027 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007028 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007029
Karl Schultzc59b72d2017-02-24 15:45:05 -07007030 m_errorMonitor->ExpectSuccess();
7031 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7032 m_errorMonitor->VerifyNotFound();
7033 m_errorMonitor->ExpectSuccess();
7034 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7035 m_errorMonitor->VerifyNotFound();
7036 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7037 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7038 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7039 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7040 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7041 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7042 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007043 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007044 for (const auto &iter : cmd_range_tests) {
7045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7046 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7047 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007048 m_errorMonitor->VerifyFound();
7049 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007050
Tony Barbour552f6c02016-12-21 14:34:07 -07007051 m_commandBuffer->EndRenderPass();
7052 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007053 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007054}
7055
Karl Schultz6addd812016-02-02 17:17:23 -07007056TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007057 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007058 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007059
Tony Barbour1fa09702017-03-16 12:09:08 -06007060 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007061 ASSERT_NO_FATAL_FAILURE(InitViewport());
7062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7063
7064 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7065 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007066 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7067 ds_type_count[0].descriptorCount = 10;
7068 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7069 ds_type_count[1].descriptorCount = 2;
7070 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7071 ds_type_count[2].descriptorCount = 2;
7072 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7073 ds_type_count[3].descriptorCount = 5;
7074 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7075 // type
7076 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7077 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7078 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007079
7080 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007081 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7082 ds_pool_ci.pNext = NULL;
7083 ds_pool_ci.maxSets = 5;
7084 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7085 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007086
7087 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007089 ASSERT_VK_SUCCESS(err);
7090
7091 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7092 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007093 dsl_binding[0].binding = 0;
7094 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7095 dsl_binding[0].descriptorCount = 5;
7096 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7097 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007098
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007099 // Create layout identical to set0 layout but w/ different stageFlags
7100 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007101 dsl_fs_stage_only.binding = 0;
7102 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7103 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007104 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7105 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007106 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007107 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007108 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7109 ds_layout_ci.pNext = NULL;
7110 ds_layout_ci.bindingCount = 1;
7111 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007112 static const uint32_t NUM_LAYOUTS = 4;
7113 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007114 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007115 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7116 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007118 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007119 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007120 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007121 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007122 dsl_binding[0].binding = 0;
7123 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007124 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007125 dsl_binding[1].binding = 1;
7126 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7127 dsl_binding[1].descriptorCount = 2;
7128 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7129 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007130 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007131 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007132 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007133 ASSERT_VK_SUCCESS(err);
7134 dsl_binding[0].binding = 0;
7135 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007136 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007137 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007139 ASSERT_VK_SUCCESS(err);
7140 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007141 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007142 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007143 ASSERT_VK_SUCCESS(err);
7144
7145 static const uint32_t NUM_SETS = 4;
7146 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7147 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007148 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007149 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007150 alloc_info.descriptorPool = ds_pool;
7151 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007152 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007153 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007154 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007155 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007156 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007157 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007158 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007159
7160 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007161 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7162 pipeline_layout_ci.pNext = NULL;
7163 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7164 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007165
7166 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007167 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007168 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007169 // Create pipelineLayout with only one setLayout
7170 pipeline_layout_ci.setLayoutCount = 1;
7171 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007172 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007173 ASSERT_VK_SUCCESS(err);
7174 // Create pipelineLayout with 2 descriptor setLayout at index 0
7175 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7176 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007177 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007178 ASSERT_VK_SUCCESS(err);
7179 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7180 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7181 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007182 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007183 ASSERT_VK_SUCCESS(err);
7184 // Create pipelineLayout with UB type, but stageFlags for FS only
7185 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7186 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007187 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007188 ASSERT_VK_SUCCESS(err);
7189 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7190 VkDescriptorSetLayout pl_bad_s0[2] = {};
7191 pl_bad_s0[0] = ds_layout_fs_only;
7192 pl_bad_s0[1] = ds_layout[1];
7193 pipeline_layout_ci.setLayoutCount = 2;
7194 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7195 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007197 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007198
Tobin Ehlis88452832015-12-03 09:40:56 -07007199 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007200 char const *vsSource =
7201 "#version 450\n"
7202 "\n"
7203 "out gl_PerVertex {\n"
7204 " vec4 gl_Position;\n"
7205 "};\n"
7206 "void main(){\n"
7207 " gl_Position = vec4(1);\n"
7208 "}\n";
7209 char const *fsSource =
7210 "#version 450\n"
7211 "\n"
7212 "layout(location=0) out vec4 x;\n"
7213 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7214 "void main(){\n"
7215 " x = vec4(bar.y);\n"
7216 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007217 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7218 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007219 VkPipelineObj pipe(m_device);
7220 pipe.AddShader(&vs);
7221 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007222 pipe.AddColorAttachment();
7223 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007224
Tony Barbour552f6c02016-12-21 14:34:07 -07007225 m_commandBuffer->BeginCommandBuffer();
7226 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007227
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007228 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007229 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7230 // of PSO
7231 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7232 // cmd_pipeline.c
7233 // due to the fact that cmd_alloc_dset_data() has not been called in
7234 // cmd_bind_graphics_pipeline()
7235 // TODO : Want to cause various binding incompatibility issues here to test
7236 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007237 // First cause various verify_layout_compatibility() fails
7238 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007239 // verify_set_layout_compatibility fail cases:
7240 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007242 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7243 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007244 m_errorMonitor->VerifyFound();
7245
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007246 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7248 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7249 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007250 m_errorMonitor->VerifyFound();
7251
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007252 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007253 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7254 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7256 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7257 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007258 m_errorMonitor->VerifyFound();
7259
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007260 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7261 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7263 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7264 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007265 m_errorMonitor->VerifyFound();
7266
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007267 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7268 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7270 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7271 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7272 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007273 m_errorMonitor->VerifyFound();
7274
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007275 // Cause INFO messages due to disturbing previously bound Sets
7276 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007277 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7278 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007279 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7281 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7282 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007283 m_errorMonitor->VerifyFound();
7284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7286 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007287 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7289 " newly bound as set #0 so set #1 and "
7290 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7292 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007293 m_errorMonitor->VerifyFound();
7294
Tobin Ehlis10fad692016-07-07 12:00:36 -06007295 // Now that we're done actively using the pipelineLayout that gfx pipeline
7296 // was created with, we should be able to delete it. Do that now to verify
7297 // that validation obeys pipelineLayout lifetime
7298 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7299
Tobin Ehlis88452832015-12-03 09:40:56 -07007300 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007301 // 1. Error due to not binding required set (we actually use same code as
7302 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007303 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7304 &descriptorSet[0], 0, NULL);
7305 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7306 &descriptorSet[1], 0, NULL);
7307 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 -07007308
7309 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7310 VkRect2D scissor = {{0, 0}, {16, 16}};
7311 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7312 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7313
Tobin Ehlis88452832015-12-03 09:40:56 -07007314 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007315 m_errorMonitor->VerifyFound();
7316
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007317 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007318 // 2. Error due to bound set not being compatible with PSO's
7319 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7321 &descriptorSet[0], 0, NULL);
7322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007323 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007324 m_errorMonitor->VerifyFound();
7325
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007326 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007327 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007328 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7329 }
7330 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7332 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7333}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007334
Karl Schultz6addd812016-02-02 17:17:23 -07007335TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7337 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007338
Tony Barbour1fa09702017-03-16 12:09:08 -06007339 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007340 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007341 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007342 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007344 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007345}
7346
Karl Schultz6addd812016-02-02 17:17:23 -07007347TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7348 VkResult err;
7349 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007350
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007352
Tony Barbour1fa09702017-03-16 12:09:08 -06007353 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007354
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007355 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007356 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007357 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007358 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007359 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007360 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007361
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007362 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007363 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007364
7365 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007366 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007367 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7368
7369 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007370 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007371 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007372 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 -07007373 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007374
7375 // The error should be caught by validation of the BeginCommandBuffer call
7376 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007378 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007379 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007380}
7381
Karl Schultz6addd812016-02-02 17:17:23 -07007382TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007383 // Cause error due to Begin while recording CB
7384 // Then cause 2 errors for attempting to reset CB w/o having
7385 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7386 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007388
Tony Barbour1fa09702017-03-16 12:09:08 -06007389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007390
7391 // Calls AllocateCommandBuffers
7392 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7393
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007394 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007395 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007396 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7397 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007398 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7399 cmd_buf_info.pNext = NULL;
7400 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007401 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007402
7403 // Begin CB to transition to recording state
7404 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7405 // Can't re-begin. This should trigger error
7406 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007407 m_errorMonitor->VerifyFound();
7408
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007410 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007411 // Reset attempt will trigger error due to incorrect CommandPool state
7412 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007413 m_errorMonitor->VerifyFound();
7414
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007416 // Transition CB to RECORDED state
7417 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7418 // Now attempting to Begin will implicitly reset, which triggers error
7419 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007420 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007421}
7422
Karl Schultz6addd812016-02-02 17:17:23 -07007423TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007424 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007425 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007426
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7428 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007429
Tony Barbour1fa09702017-03-16 12:09:08 -06007430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007432
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7435 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007436
7437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7439 ds_pool_ci.pNext = NULL;
7440 ds_pool_ci.maxSets = 1;
7441 ds_pool_ci.poolSizeCount = 1;
7442 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007443
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007444 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007445 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007446 ASSERT_VK_SUCCESS(err);
7447
Tony Barboureb254902015-07-15 12:50:33 -06007448 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007449 dsl_binding.binding = 0;
7450 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7451 dsl_binding.descriptorCount = 1;
7452 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7453 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007454
Tony Barboureb254902015-07-15 12:50:33 -06007455 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007456 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7457 ds_layout_ci.pNext = NULL;
7458 ds_layout_ci.bindingCount = 1;
7459 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007460
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007461 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007462 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007463 ASSERT_VK_SUCCESS(err);
7464
7465 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007466 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007467 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007468 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007469 alloc_info.descriptorPool = ds_pool;
7470 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007471 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007472 ASSERT_VK_SUCCESS(err);
7473
Tony Barboureb254902015-07-15 12:50:33 -06007474 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007475 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7476 pipeline_layout_ci.setLayoutCount = 1;
7477 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007478
7479 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007480 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007481 ASSERT_VK_SUCCESS(err);
7482
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007483 VkViewport vp = {}; // Just need dummy vp to point to
7484 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007485
7486 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007487 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7488 vp_state_ci.scissorCount = 1;
7489 vp_state_ci.pScissors = &sc;
7490 vp_state_ci.viewportCount = 1;
7491 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007492
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007493 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7494 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7495 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7496 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7497 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7498 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007499 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007500 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007501 rs_state_ci.lineWidth = 1.0f;
7502
7503 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7504 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7505 vi_ci.pNext = nullptr;
7506 vi_ci.vertexBindingDescriptionCount = 0;
7507 vi_ci.pVertexBindingDescriptions = nullptr;
7508 vi_ci.vertexAttributeDescriptionCount = 0;
7509 vi_ci.pVertexAttributeDescriptions = nullptr;
7510
7511 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7512 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7513 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7514
7515 VkPipelineShaderStageCreateInfo shaderStages[2];
7516 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7517
7518 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7519 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007520 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007521 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007522
Tony Barboureb254902015-07-15 12:50:33 -06007523 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007524 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7525 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007526 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007527 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7528 gp_ci.layout = pipeline_layout;
7529 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007530 gp_ci.pVertexInputState = &vi_ci;
7531 gp_ci.pInputAssemblyState = &ia_ci;
7532
7533 gp_ci.stageCount = 1;
7534 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007535
7536 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007537 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7538 pc_ci.initialDataSize = 0;
7539 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007540
7541 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007542 VkPipelineCache pipelineCache;
7543
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007544 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007545 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007546 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007547 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007548
Chia-I Wuf7458c52015-10-26 21:10:41 +08007549 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7550 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7551 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7552 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007553}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007554
Tobin Ehlis912df022015-09-17 08:46:18 -06007555/*// TODO : This test should be good, but needs Tess support in compiler to run
7556TEST_F(VkLayerTest, InvalidPatchControlPoints)
7557{
7558 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007559 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007560
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007562 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7563primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007564
Tony Barbour1fa09702017-03-16 12:09:08 -06007565 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007567
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007568 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007569 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007570 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007571
7572 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7573 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7574 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007575 ds_pool_ci.poolSizeCount = 1;
7576 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007577
7578 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007579 err = vkCreateDescriptorPool(m_device->device(),
7580VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007581 ASSERT_VK_SUCCESS(err);
7582
7583 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007584 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007585 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007586 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007587 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7588 dsl_binding.pImmutableSamplers = NULL;
7589
7590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007591 ds_layout_ci.sType =
7592VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007593 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007594 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007595 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007596
7597 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007598 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7599&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007600 ASSERT_VK_SUCCESS(err);
7601
7602 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007603 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7604VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007605 ASSERT_VK_SUCCESS(err);
7606
7607 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007608 pipeline_layout_ci.sType =
7609VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007610 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007611 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007612 pipeline_layout_ci.pSetLayouts = &ds_layout;
7613
7614 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007615 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7616&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007617 ASSERT_VK_SUCCESS(err);
7618
7619 VkPipelineShaderStageCreateInfo shaderStages[3];
7620 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7621
Karl Schultz6addd812016-02-02 17:17:23 -07007622 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7623this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007624 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007625 VkShaderObj
7626tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7627this);
7628 VkShaderObj
7629te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7630this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007631
Karl Schultz6addd812016-02-02 17:17:23 -07007632 shaderStages[0].sType =
7633VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007634 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007635 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007636 shaderStages[1].sType =
7637VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007638 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007639 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007640 shaderStages[2].sType =
7641VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007642 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007643 shaderStages[2].shader = te.handle();
7644
7645 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007646 iaCI.sType =
7647VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007648 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007649
7650 VkPipelineTessellationStateCreateInfo tsCI = {};
7651 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7652 tsCI.patchControlPoints = 0; // This will cause an error
7653
7654 VkGraphicsPipelineCreateInfo gp_ci = {};
7655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7656 gp_ci.pNext = NULL;
7657 gp_ci.stageCount = 3;
7658 gp_ci.pStages = shaderStages;
7659 gp_ci.pVertexInputState = NULL;
7660 gp_ci.pInputAssemblyState = &iaCI;
7661 gp_ci.pTessellationState = &tsCI;
7662 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007663 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007664 gp_ci.pMultisampleState = NULL;
7665 gp_ci.pDepthStencilState = NULL;
7666 gp_ci.pColorBlendState = NULL;
7667 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7668 gp_ci.layout = pipeline_layout;
7669 gp_ci.renderPass = renderPass();
7670
7671 VkPipelineCacheCreateInfo pc_ci = {};
7672 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7673 pc_ci.pNext = NULL;
7674 pc_ci.initialSize = 0;
7675 pc_ci.initialData = 0;
7676 pc_ci.maxSize = 0;
7677
7678 VkPipeline pipeline;
7679 VkPipelineCache pipelineCache;
7680
Karl Schultz6addd812016-02-02 17:17:23 -07007681 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7682&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007683 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007684 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7685&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007686
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007687 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007688
Chia-I Wuf7458c52015-10-26 21:10:41 +08007689 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007693}
7694*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007695
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007696TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007697 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007698
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007699 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007700
Tony Barbour1fa09702017-03-16 12:09:08 -06007701 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007702 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007703
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007704 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007705 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7706 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007707
7708 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7710 ds_pool_ci.maxSets = 1;
7711 ds_pool_ci.poolSizeCount = 1;
7712 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007713
7714 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007715 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007716 ASSERT_VK_SUCCESS(err);
7717
7718 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007719 dsl_binding.binding = 0;
7720 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7721 dsl_binding.descriptorCount = 1;
7722 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007723
7724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7726 ds_layout_ci.bindingCount = 1;
7727 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007728
7729 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007731 ASSERT_VK_SUCCESS(err);
7732
7733 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007734 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007736 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007737 alloc_info.descriptorPool = ds_pool;
7738 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007740 ASSERT_VK_SUCCESS(err);
7741
7742 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007743 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7744 pipeline_layout_ci.setLayoutCount = 1;
7745 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007746
7747 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007748 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007749 ASSERT_VK_SUCCESS(err);
7750
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007751 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007752 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007753 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007754 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007755 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007756 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007757
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007758 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7759 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7760 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7761 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7762 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7763 rs_state_ci.depthClampEnable = VK_FALSE;
7764 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7765 rs_state_ci.depthBiasEnable = VK_FALSE;
7766
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007767 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7768 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7769 vi_ci.pNext = nullptr;
7770 vi_ci.vertexBindingDescriptionCount = 0;
7771 vi_ci.pVertexBindingDescriptions = nullptr;
7772 vi_ci.vertexAttributeDescriptionCount = 0;
7773 vi_ci.pVertexAttributeDescriptions = nullptr;
7774
7775 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7776 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7777 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7778
7779 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7780 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7781 pipe_ms_state_ci.pNext = NULL;
7782 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7783 pipe_ms_state_ci.sampleShadingEnable = 0;
7784 pipe_ms_state_ci.minSampleShading = 1.0;
7785 pipe_ms_state_ci.pSampleMask = NULL;
7786
Cody Northropeb3a6c12015-10-05 14:44:45 -06007787 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007788 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007789
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007790 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007791 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007792 shaderStages[0] = vs.GetStageCreateInfo();
7793 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007794
7795 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007796 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7797 gp_ci.stageCount = 2;
7798 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007799 gp_ci.pVertexInputState = &vi_ci;
7800 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007801 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007802 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007803 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007804 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7805 gp_ci.layout = pipeline_layout;
7806 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007807
7808 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007809 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007810
7811 VkPipeline pipeline;
7812 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007813 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007814 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007815
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007816 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007817 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007818
7819 // Check case where multiViewport is disabled and viewport count is not 1
7820 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7823 vp_state_ci.scissorCount = 0;
7824 vp_state_ci.viewportCount = 0;
7825 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7826 m_errorMonitor->VerifyFound();
7827 } else {
7828 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007829 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007830 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007831 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007832
7833 // Check is that viewportcount and scissorcount match
7834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7835 vp_state_ci.scissorCount = 1;
7836 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7837 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7838 m_errorMonitor->VerifyFound();
7839
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007840 // Check case where multiViewport is enabled and viewport count is greater than max
7841 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7844 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7845 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7846 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7847 m_errorMonitor->VerifyFound();
7848 }
7849 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007850
Chia-I Wuf7458c52015-10-26 21:10:41 +08007851 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7852 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7853 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7854 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007855}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007856
7857// 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
7858// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007859TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007860 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007861
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007862 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7863
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007865
Tony Barbour1fa09702017-03-16 12:09:08 -06007866 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007868
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007869 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007870 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7871 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007872
7873 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007874 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7875 ds_pool_ci.maxSets = 1;
7876 ds_pool_ci.poolSizeCount = 1;
7877 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007878
7879 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007880 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007881 ASSERT_VK_SUCCESS(err);
7882
7883 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007884 dsl_binding.binding = 0;
7885 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7886 dsl_binding.descriptorCount = 1;
7887 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007888
7889 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007890 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7891 ds_layout_ci.bindingCount = 1;
7892 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007893
7894 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007895 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007896 ASSERT_VK_SUCCESS(err);
7897
7898 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007899 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007900 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007901 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007902 alloc_info.descriptorPool = ds_pool;
7903 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007904 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007905 ASSERT_VK_SUCCESS(err);
7906
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007907 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7908 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7909 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7910
7911 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7912 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7913 vi_ci.pNext = nullptr;
7914 vi_ci.vertexBindingDescriptionCount = 0;
7915 vi_ci.pVertexBindingDescriptions = nullptr;
7916 vi_ci.vertexAttributeDescriptionCount = 0;
7917 vi_ci.pVertexAttributeDescriptions = nullptr;
7918
7919 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7920 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7921 pipe_ms_state_ci.pNext = NULL;
7922 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7923 pipe_ms_state_ci.sampleShadingEnable = 0;
7924 pipe_ms_state_ci.minSampleShading = 1.0;
7925 pipe_ms_state_ci.pSampleMask = NULL;
7926
Tobin Ehlise68360f2015-10-01 11:15:13 -06007927 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007928 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7929 pipeline_layout_ci.setLayoutCount = 1;
7930 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007931
7932 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007933 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934 ASSERT_VK_SUCCESS(err);
7935
7936 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7937 // Set scissor as dynamic to avoid second error
7938 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007939 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7940 dyn_state_ci.dynamicStateCount = 1;
7941 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007942
Cody Northropeb3a6c12015-10-05 14:44:45 -06007943 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007944 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007946 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007947 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7948 // 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 +08007949 shaderStages[0] = vs.GetStageCreateInfo();
7950 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007951
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007952 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7953 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7954 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7955 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7956 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7957 rs_state_ci.depthClampEnable = VK_FALSE;
7958 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7959 rs_state_ci.depthBiasEnable = VK_FALSE;
7960
Tobin Ehlise68360f2015-10-01 11:15:13 -06007961 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007962 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7963 gp_ci.stageCount = 2;
7964 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007965 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007966 // Not setting VP state w/o dynamic vp state should cause validation error
7967 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007968 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007969 gp_ci.pVertexInputState = &vi_ci;
7970 gp_ci.pInputAssemblyState = &ia_ci;
7971 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007972 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7973 gp_ci.layout = pipeline_layout;
7974 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975
7976 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007977 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007978
7979 VkPipeline pipeline;
7980 VkPipelineCache pipelineCache;
7981
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007982 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007983 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007984 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007986 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007987
Chia-I Wuf7458c52015-10-26 21:10:41 +08007988 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7989 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7990 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7991 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007993
7994// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7995// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007996TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7997 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007998
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008000
Tony Barbour1fa09702017-03-16 12:09:08 -06008001 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008002
8003 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008004 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008005 return;
8006 }
8007
Tobin Ehlise68360f2015-10-01 11:15:13 -06008008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008009
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008010 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008011 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8012 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8016 ds_pool_ci.maxSets = 1;
8017 ds_pool_ci.poolSizeCount = 1;
8018 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019
8020 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008021 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008022 ASSERT_VK_SUCCESS(err);
8023
8024 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008025 dsl_binding.binding = 0;
8026 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8027 dsl_binding.descriptorCount = 1;
8028 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008029
8030 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008031 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8032 ds_layout_ci.bindingCount = 1;
8033 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008034
8035 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008036 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008037 ASSERT_VK_SUCCESS(err);
8038
8039 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008040 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008041 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008042 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008043 alloc_info.descriptorPool = ds_pool;
8044 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008045 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008046 ASSERT_VK_SUCCESS(err);
8047
8048 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008049 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8050 pipeline_layout_ci.setLayoutCount = 1;
8051 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008052
8053 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008054 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055 ASSERT_VK_SUCCESS(err);
8056
8057 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008058 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8059 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008060 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008061 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008062 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008063
8064 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8065 // Set scissor as dynamic to avoid that error
8066 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008067 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8068 dyn_state_ci.dynamicStateCount = 1;
8069 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008070
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008071 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8072 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8073 pipe_ms_state_ci.pNext = NULL;
8074 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8075 pipe_ms_state_ci.sampleShadingEnable = 0;
8076 pipe_ms_state_ci.minSampleShading = 1.0;
8077 pipe_ms_state_ci.pSampleMask = NULL;
8078
Cody Northropeb3a6c12015-10-05 14:44:45 -06008079 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008080 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008081
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008082 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008083 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8084 // 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 +08008085 shaderStages[0] = vs.GetStageCreateInfo();
8086 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087
Cody Northropf6622dc2015-10-06 10:33:21 -06008088 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8089 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8090 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008091 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008092 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008093 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008094 vi_ci.pVertexAttributeDescriptions = nullptr;
8095
8096 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8097 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8098 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8099
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008100 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008101 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008102 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008103 rs_ci.pNext = nullptr;
8104
Mark Youngc89c6312016-03-31 16:03:20 -06008105 VkPipelineColorBlendAttachmentState att = {};
8106 att.blendEnable = VK_FALSE;
8107 att.colorWriteMask = 0xf;
8108
Cody Northropf6622dc2015-10-06 10:33:21 -06008109 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8110 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8111 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008112 cb_ci.attachmentCount = 1;
8113 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008114
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008116 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8117 gp_ci.stageCount = 2;
8118 gp_ci.pStages = shaderStages;
8119 gp_ci.pVertexInputState = &vi_ci;
8120 gp_ci.pInputAssemblyState = &ia_ci;
8121 gp_ci.pViewportState = &vp_state_ci;
8122 gp_ci.pRasterizationState = &rs_ci;
8123 gp_ci.pColorBlendState = &cb_ci;
8124 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008125 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008126 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8127 gp_ci.layout = pipeline_layout;
8128 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008129
8130 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008131 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008132
8133 VkPipeline pipeline;
8134 VkPipelineCache pipelineCache;
8135
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008136 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008137 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008138 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008140 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008141
Tobin Ehlisd332f282015-10-02 11:00:56 -06008142 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008143 // First need to successfully create the PSO from above by setting
8144 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008145 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 -07008146
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008147 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008148 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008149 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008150 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008151 m_commandBuffer->BeginCommandBuffer();
8152 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008153 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008154 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008155 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008156 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008157 Draw(1, 0, 0, 0);
8158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008159 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008160
8161 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8162 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8163 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8164 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008165 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008166}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008167
8168// 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 -07008169// viewportCount
8170TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8171 VkResult err;
8172
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008174
Tony Barbour1fa09702017-03-16 12:09:08 -06008175 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008176
8177 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008178 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008179 return;
8180 }
8181
Karl Schultz6addd812016-02-02 17:17:23 -07008182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8183
8184 VkDescriptorPoolSize ds_type_count = {};
8185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8186 ds_type_count.descriptorCount = 1;
8187
8188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8190 ds_pool_ci.maxSets = 1;
8191 ds_pool_ci.poolSizeCount = 1;
8192 ds_pool_ci.pPoolSizes = &ds_type_count;
8193
8194 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008195 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008196 ASSERT_VK_SUCCESS(err);
8197
8198 VkDescriptorSetLayoutBinding dsl_binding = {};
8199 dsl_binding.binding = 0;
8200 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8201 dsl_binding.descriptorCount = 1;
8202 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8203
8204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8206 ds_layout_ci.bindingCount = 1;
8207 ds_layout_ci.pBindings = &dsl_binding;
8208
8209 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008211 ASSERT_VK_SUCCESS(err);
8212
8213 VkDescriptorSet descriptorSet;
8214 VkDescriptorSetAllocateInfo alloc_info = {};
8215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8216 alloc_info.descriptorSetCount = 1;
8217 alloc_info.descriptorPool = ds_pool;
8218 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008220 ASSERT_VK_SUCCESS(err);
8221
8222 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8223 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8224 pipeline_layout_ci.setLayoutCount = 1;
8225 pipeline_layout_ci.pSetLayouts = &ds_layout;
8226
8227 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008228 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008229 ASSERT_VK_SUCCESS(err);
8230
8231 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8232 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8233 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008234 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008235 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008236 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008237
8238 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8239 // Set scissor as dynamic to avoid that error
8240 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8241 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8242 dyn_state_ci.dynamicStateCount = 1;
8243 dyn_state_ci.pDynamicStates = &vp_state;
8244
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008245 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8246 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8247 pipe_ms_state_ci.pNext = NULL;
8248 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8249 pipe_ms_state_ci.sampleShadingEnable = 0;
8250 pipe_ms_state_ci.minSampleShading = 1.0;
8251 pipe_ms_state_ci.pSampleMask = NULL;
8252
Karl Schultz6addd812016-02-02 17:17:23 -07008253 VkPipelineShaderStageCreateInfo shaderStages[2];
8254 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008256 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008257 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8258 // 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 -07008259 shaderStages[0] = vs.GetStageCreateInfo();
8260 shaderStages[1] = fs.GetStageCreateInfo();
8261
8262 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8263 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8264 vi_ci.pNext = nullptr;
8265 vi_ci.vertexBindingDescriptionCount = 0;
8266 vi_ci.pVertexBindingDescriptions = nullptr;
8267 vi_ci.vertexAttributeDescriptionCount = 0;
8268 vi_ci.pVertexAttributeDescriptions = nullptr;
8269
8270 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8271 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8272 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8273
8274 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8275 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008276 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008277 rs_ci.pNext = nullptr;
8278
Mark Youngc89c6312016-03-31 16:03:20 -06008279 VkPipelineColorBlendAttachmentState att = {};
8280 att.blendEnable = VK_FALSE;
8281 att.colorWriteMask = 0xf;
8282
Karl Schultz6addd812016-02-02 17:17:23 -07008283 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8284 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8285 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008286 cb_ci.attachmentCount = 1;
8287 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008288
8289 VkGraphicsPipelineCreateInfo gp_ci = {};
8290 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8291 gp_ci.stageCount = 2;
8292 gp_ci.pStages = shaderStages;
8293 gp_ci.pVertexInputState = &vi_ci;
8294 gp_ci.pInputAssemblyState = &ia_ci;
8295 gp_ci.pViewportState = &vp_state_ci;
8296 gp_ci.pRasterizationState = &rs_ci;
8297 gp_ci.pColorBlendState = &cb_ci;
8298 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008299 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008300 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8301 gp_ci.layout = pipeline_layout;
8302 gp_ci.renderPass = renderPass();
8303
8304 VkPipelineCacheCreateInfo pc_ci = {};
8305 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8306
8307 VkPipeline pipeline;
8308 VkPipelineCache pipelineCache;
8309
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008310 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008311 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008312 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008314 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008315
8316 // Now hit second fail case where we set scissor w/ different count than PSO
8317 // First need to successfully create the PSO from above by setting
8318 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8320 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008321
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008322 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008323 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008324 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008325 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008326 m_commandBuffer->BeginCommandBuffer();
8327 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008328 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008329 VkViewport viewports[1] = {};
8330 viewports[0].width = 8;
8331 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008332 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008333 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008334 Draw(1, 0, 0, 0);
8335
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008336 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008337
Chia-I Wuf7458c52015-10-26 21:10:41 +08008338 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8339 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8340 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8341 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008342 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008343}
8344
Mark Young7394fdd2016-03-31 14:56:43 -06008345TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8346 VkResult err;
8347
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008349
Tony Barbour1fa09702017-03-16 12:09:08 -06008350 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8352
8353 VkDescriptorPoolSize ds_type_count = {};
8354 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8355 ds_type_count.descriptorCount = 1;
8356
8357 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8358 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8359 ds_pool_ci.maxSets = 1;
8360 ds_pool_ci.poolSizeCount = 1;
8361 ds_pool_ci.pPoolSizes = &ds_type_count;
8362
8363 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008364 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008365 ASSERT_VK_SUCCESS(err);
8366
8367 VkDescriptorSetLayoutBinding dsl_binding = {};
8368 dsl_binding.binding = 0;
8369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8370 dsl_binding.descriptorCount = 1;
8371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8372
8373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8375 ds_layout_ci.bindingCount = 1;
8376 ds_layout_ci.pBindings = &dsl_binding;
8377
8378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008380 ASSERT_VK_SUCCESS(err);
8381
8382 VkDescriptorSet descriptorSet;
8383 VkDescriptorSetAllocateInfo alloc_info = {};
8384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8385 alloc_info.descriptorSetCount = 1;
8386 alloc_info.descriptorPool = ds_pool;
8387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008389 ASSERT_VK_SUCCESS(err);
8390
8391 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8392 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8393 pipeline_layout_ci.setLayoutCount = 1;
8394 pipeline_layout_ci.pSetLayouts = &ds_layout;
8395
8396 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008397 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008398 ASSERT_VK_SUCCESS(err);
8399
8400 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8401 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8402 vp_state_ci.scissorCount = 1;
8403 vp_state_ci.pScissors = NULL;
8404 vp_state_ci.viewportCount = 1;
8405 vp_state_ci.pViewports = NULL;
8406
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008407 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008408 // Set scissor as dynamic to avoid that error
8409 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8410 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8411 dyn_state_ci.dynamicStateCount = 2;
8412 dyn_state_ci.pDynamicStates = dynamic_states;
8413
8414 VkPipelineShaderStageCreateInfo shaderStages[2];
8415 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8416
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008417 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8418 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008419 this); // TODO - We shouldn't need a fragment shader
8420 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008421 shaderStages[0] = vs.GetStageCreateInfo();
8422 shaderStages[1] = fs.GetStageCreateInfo();
8423
8424 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8425 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8426 vi_ci.pNext = nullptr;
8427 vi_ci.vertexBindingDescriptionCount = 0;
8428 vi_ci.pVertexBindingDescriptions = nullptr;
8429 vi_ci.vertexAttributeDescriptionCount = 0;
8430 vi_ci.pVertexAttributeDescriptions = nullptr;
8431
8432 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8433 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8434 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8435
8436 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8437 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8438 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008439 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008440
Mark Young47107952016-05-02 15:59:55 -06008441 // Check too low (line width of -1.0f).
8442 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008443
8444 VkPipelineColorBlendAttachmentState att = {};
8445 att.blendEnable = VK_FALSE;
8446 att.colorWriteMask = 0xf;
8447
8448 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8449 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8450 cb_ci.pNext = nullptr;
8451 cb_ci.attachmentCount = 1;
8452 cb_ci.pAttachments = &att;
8453
8454 VkGraphicsPipelineCreateInfo gp_ci = {};
8455 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8456 gp_ci.stageCount = 2;
8457 gp_ci.pStages = shaderStages;
8458 gp_ci.pVertexInputState = &vi_ci;
8459 gp_ci.pInputAssemblyState = &ia_ci;
8460 gp_ci.pViewportState = &vp_state_ci;
8461 gp_ci.pRasterizationState = &rs_ci;
8462 gp_ci.pColorBlendState = &cb_ci;
8463 gp_ci.pDynamicState = &dyn_state_ci;
8464 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8465 gp_ci.layout = pipeline_layout;
8466 gp_ci.renderPass = renderPass();
8467
8468 VkPipelineCacheCreateInfo pc_ci = {};
8469 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8470
8471 VkPipeline pipeline;
8472 VkPipelineCache pipelineCache;
8473
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008474 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008475 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008477
8478 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008479 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008480
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008482
8483 // Check too high (line width of 65536.0f).
8484 rs_ci.lineWidth = 65536.0f;
8485
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008486 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008487 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008489
8490 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008491 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008492
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008494
8495 dyn_state_ci.dynamicStateCount = 3;
8496
8497 rs_ci.lineWidth = 1.0f;
8498
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008499 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008500 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008501 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008502 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008503 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008504
8505 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008506 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008507 m_errorMonitor->VerifyFound();
8508
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008510
8511 // Check too high with dynamic setting.
8512 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8513 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008514 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008515
8516 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8517 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8518 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8519 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008520 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008521}
8522
Karl Schultz6addd812016-02-02 17:17:23 -07008523TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008524 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008526 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008527
Tony Barbour1fa09702017-03-16 12:09:08 -06008528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008530
Tony Barbour552f6c02016-12-21 14:34:07 -07008531 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008532 // Don't care about RenderPass handle b/c error should be flagged before
8533 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008537}
8538
Karl Schultz6addd812016-02-02 17:17:23 -07008539TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008540 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8542 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008543
Tony Barbour1fa09702017-03-16 12:09:08 -06008544 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008546
Tony Barbour552f6c02016-12-21 14:34:07 -07008547 m_commandBuffer->BeginCommandBuffer();
8548 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008549 // Just create a dummy Renderpass that's non-NULL so we can get to the
8550 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008551 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008552
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008553 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008554}
8555
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008556TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008557 TEST_DESCRIPTION(
8558 "Begin a renderPass where clearValueCount is less than"
8559 "the number of renderPass attachments that use loadOp"
8560 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008561
Tony Barbour1fa09702017-03-16 12:09:08 -06008562 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8564
8565 // Create a renderPass with a single attachment that uses loadOp CLEAR
8566 VkAttachmentReference attach = {};
8567 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8568 VkSubpassDescription subpass = {};
8569 subpass.inputAttachmentCount = 1;
8570 subpass.pInputAttachments = &attach;
8571 VkRenderPassCreateInfo rpci = {};
8572 rpci.subpassCount = 1;
8573 rpci.pSubpasses = &subpass;
8574 rpci.attachmentCount = 1;
8575 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008576 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008577 // Set loadOp to CLEAR
8578 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8579 rpci.pAttachments = &attach_desc;
8580 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8581 VkRenderPass rp;
8582 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8583
8584 VkCommandBufferInheritanceInfo hinfo = {};
8585 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8586 hinfo.renderPass = VK_NULL_HANDLE;
8587 hinfo.subpass = 0;
8588 hinfo.framebuffer = VK_NULL_HANDLE;
8589 hinfo.occlusionQueryEnable = VK_FALSE;
8590 hinfo.queryFlags = 0;
8591 hinfo.pipelineStatistics = 0;
8592 VkCommandBufferBeginInfo info = {};
8593 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8594 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8595 info.pInheritanceInfo = &hinfo;
8596
8597 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8598 VkRenderPassBeginInfo rp_begin = {};
8599 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8600 rp_begin.pNext = NULL;
8601 rp_begin.renderPass = renderPass();
8602 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008603 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008604
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008606
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008607 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008608
8609 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008610
8611 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008612}
8613
Slawomir Cygan0808f392016-11-28 17:53:23 +01008614TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008615 TEST_DESCRIPTION(
8616 "Begin a renderPass where clearValueCount is greater than"
8617 "the number of renderPass attachments that use loadOp"
8618 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008619
Tony Barbour1fa09702017-03-16 12:09:08 -06008620 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8622
8623 // Create a renderPass with a single attachment that uses loadOp CLEAR
8624 VkAttachmentReference attach = {};
8625 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8626 VkSubpassDescription subpass = {};
8627 subpass.inputAttachmentCount = 1;
8628 subpass.pInputAttachments = &attach;
8629 VkRenderPassCreateInfo rpci = {};
8630 rpci.subpassCount = 1;
8631 rpci.pSubpasses = &subpass;
8632 rpci.attachmentCount = 1;
8633 VkAttachmentDescription attach_desc = {};
8634 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8635 // Set loadOp to CLEAR
8636 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8637 rpci.pAttachments = &attach_desc;
8638 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8639 VkRenderPass rp;
8640 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8641
8642 VkCommandBufferBeginInfo info = {};
8643 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8644 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8645
8646 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8647 VkRenderPassBeginInfo rp_begin = {};
8648 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8649 rp_begin.pNext = NULL;
8650 rp_begin.renderPass = renderPass();
8651 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008652 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008653
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8655 " has a clearValueCount of"
8656 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008657
8658 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8659
8660 m_errorMonitor->VerifyFound();
8661
8662 vkDestroyRenderPass(m_device->device(), rp, NULL);
8663}
8664
Cody Northrop3bb4d962016-05-09 16:15:57 -06008665TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008666 TEST_DESCRIPTION("End a command buffer with an active render pass");
8667
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8669 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008670
Tony Barbour1fa09702017-03-16 12:09:08 -06008671 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8673
Tony Barbour552f6c02016-12-21 14:34:07 -07008674 m_commandBuffer->BeginCommandBuffer();
8675 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8676 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008677
8678 m_errorMonitor->VerifyFound();
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8681 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008682}
8683
Karl Schultz6addd812016-02-02 17:17:23 -07008684TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008685 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8687 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008688
Tony Barbour1fa09702017-03-16 12:09:08 -06008689 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008691
Tony Barbour552f6c02016-12-21 14:34:07 -07008692 m_commandBuffer->BeginCommandBuffer();
8693 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694
8695 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008696 vk_testing::Buffer dstBuffer;
8697 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008698
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008699 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008701 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702}
8703
Karl Schultz6addd812016-02-02 17:17:23 -07008704TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008705 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8707 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708
Tony Barbour1fa09702017-03-16 12:09:08 -06008709 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008710 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008711
Tony Barbour552f6c02016-12-21 14:34:07 -07008712 m_commandBuffer->BeginCommandBuffer();
8713 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008714
8715 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008716 vk_testing::Buffer dstBuffer;
8717 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008718
Karl Schultz6addd812016-02-02 17:17:23 -07008719 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008720 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8721 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8722 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008723
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008724 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008725}
8726
Karl Schultz6addd812016-02-02 17:17:23 -07008727TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008728 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8730 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008731
Tony Barbour1fa09702017-03-16 12:09:08 -06008732 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008734
Tony Barbour552f6c02016-12-21 14:34:07 -07008735 m_commandBuffer->BeginCommandBuffer();
8736 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008737
Michael Lentine0a369f62016-02-03 16:51:46 -06008738 VkClearColorValue clear_color;
8739 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008740 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8741 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8742 const int32_t tex_width = 32;
8743 const int32_t tex_height = 32;
8744 VkImageCreateInfo image_create_info = {};
8745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8746 image_create_info.pNext = NULL;
8747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8748 image_create_info.format = tex_format;
8749 image_create_info.extent.width = tex_width;
8750 image_create_info.extent.height = tex_height;
8751 image_create_info.extent.depth = 1;
8752 image_create_info.mipLevels = 1;
8753 image_create_info.arrayLayers = 1;
8754 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8755 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008756 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008757
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008758 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008759 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008761 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008762
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008763 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008764
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008765 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008766}
8767
Karl Schultz6addd812016-02-02 17:17:23 -07008768TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008769 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8771 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008772
Tony Barbour1fa09702017-03-16 12:09:08 -06008773 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008775
Dave Houlton1d2022c2017-03-29 11:43:58 -06008776 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008777 if (!depth_format) {
8778 printf(" No Depth + Stencil format found. Skipped.\n");
8779 return;
8780 }
8781
Tony Barbour552f6c02016-12-21 14:34:07 -07008782 m_commandBuffer->BeginCommandBuffer();
8783 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008784
8785 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008786 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008787 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8788 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008789 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008790 image_create_info.extent.width = 64;
8791 image_create_info.extent.height = 64;
8792 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8793 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008794
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008795 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008796 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008797
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008798 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008799
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008800 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8801 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008802
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008803 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008804}
8805
Karl Schultz6addd812016-02-02 17:17:23 -07008806TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008807 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008808 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008809
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8811 "vkCmdClearAttachments(): This call "
8812 "must be issued inside an active "
8813 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008814
Tony Barbour1fa09702017-03-16 12:09:08 -06008815 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817
8818 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008819 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008820 ASSERT_VK_SUCCESS(err);
8821
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008822 VkClearAttachment color_attachment;
8823 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8824 color_attachment.clearValue.color.float32[0] = 0;
8825 color_attachment.clearValue.color.float32[1] = 0;
8826 color_attachment.clearValue.color.float32[2] = 0;
8827 color_attachment.clearValue.color.float32[3] = 0;
8828 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008829 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008830 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008831
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008832 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008833}
8834
Chris Forbes3b97e932016-09-07 11:29:24 +12008835TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008836 TEST_DESCRIPTION(
8837 "Test that an error is produced when CmdNextSubpass is "
8838 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008839
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8841 "vkCmdNextSubpass(): Attempted to advance "
8842 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008843
Tony Barbour1fa09702017-03-16 12:09:08 -06008844 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8846
Tony Barbour552f6c02016-12-21 14:34:07 -07008847 m_commandBuffer->BeginCommandBuffer();
8848 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008849
8850 // error here.
8851 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8852 m_errorMonitor->VerifyFound();
8853
Tony Barbour552f6c02016-12-21 14:34:07 -07008854 m_commandBuffer->EndRenderPass();
8855 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008856}
8857
Chris Forbes6d624702016-09-07 13:57:05 +12008858TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008859 TEST_DESCRIPTION(
8860 "Test that an error is produced when CmdEndRenderPass is "
8861 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008862
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8864 "vkCmdEndRenderPass(): Called before reaching "
8865 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008866
Tony Barbour1fa09702017-03-16 12:09:08 -06008867 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8869 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008870
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008871 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008872
8873 VkRenderPass rp;
8874 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8875 ASSERT_VK_SUCCESS(err);
8876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008877 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008878
8879 VkFramebuffer fb;
8880 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8881 ASSERT_VK_SUCCESS(err);
8882
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008883 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008884
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008885 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 +12008886
8887 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8888
8889 // Error here.
8890 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8891 m_errorMonitor->VerifyFound();
8892
8893 // Clean up.
8894 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8895 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8896}
8897
Karl Schultz9e66a292016-04-21 15:57:51 -06008898TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8899 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8901 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008902
Tony Barbour1fa09702017-03-16 12:09:08 -06008903 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008904 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008905
8906 VkBufferMemoryBarrier buf_barrier = {};
8907 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8908 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8909 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8910 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8911 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8912 buf_barrier.buffer = VK_NULL_HANDLE;
8913 buf_barrier.offset = 0;
8914 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008915 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8916 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008917
8918 m_errorMonitor->VerifyFound();
8919}
8920
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008921TEST_F(VkLayerTest, InvalidBarriers) {
8922 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008925
Tony Barbour1fa09702017-03-16 12:09:08 -06008926 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06008927 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008928 if (!depth_format) {
8929 printf(" No Depth + Stencil format found. Skipped.\n");
8930 return;
8931 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8933
8934 VkMemoryBarrier mem_barrier = {};
8935 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8936 mem_barrier.pNext = NULL;
8937 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8938 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008939 m_commandBuffer->BeginCommandBuffer();
8940 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008941 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008942 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008943 &mem_barrier, 0, nullptr, 0, nullptr);
8944 m_errorMonitor->VerifyFound();
8945
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008947 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008948 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008949 ASSERT_TRUE(image.initialized());
8950 VkImageMemoryBarrier img_barrier = {};
8951 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8952 img_barrier.pNext = NULL;
8953 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8954 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8955 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8956 // New layout can't be UNDEFINED
8957 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8958 img_barrier.image = image.handle();
8959 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8960 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8961 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8962 img_barrier.subresourceRange.baseArrayLayer = 0;
8963 img_barrier.subresourceRange.baseMipLevel = 0;
8964 img_barrier.subresourceRange.layerCount = 1;
8965 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008966 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8967 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008968 m_errorMonitor->VerifyFound();
8969 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8970
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8972 "Subresource must have the sum of the "
8973 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008974 // baseArrayLayer + layerCount must be <= image's arrayLayers
8975 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8977 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008978 m_errorMonitor->VerifyFound();
8979 img_barrier.subresourceRange.baseArrayLayer = 0;
8980
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008982 // baseMipLevel + levelCount must be <= image's mipLevels
8983 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008984 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8985 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008986 m_errorMonitor->VerifyFound();
8987 img_barrier.subresourceRange.baseMipLevel = 0;
8988
Mike Weiblen7053aa32017-01-25 15:21:10 -07008989 // levelCount must be non-zero.
8990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8991 img_barrier.subresourceRange.levelCount = 0;
8992 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8993 nullptr, 0, nullptr, 1, &img_barrier);
8994 m_errorMonitor->VerifyFound();
8995 img_barrier.subresourceRange.levelCount = 1;
8996
8997 // layerCount must be non-zero.
8998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8999 img_barrier.subresourceRange.layerCount = 0;
9000 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9001 nullptr, 0, nullptr, 1, &img_barrier);
9002 m_errorMonitor->VerifyFound();
9003 img_barrier.subresourceRange.layerCount = 1;
9004
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009005 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 -06009006 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009007 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9008 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009009 VkBufferMemoryBarrier buf_barrier = {};
9010 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9011 buf_barrier.pNext = NULL;
9012 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9013 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9014 buf_barrier.buffer = buffer.handle();
9015 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9016 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9017 buf_barrier.offset = 0;
9018 buf_barrier.size = VK_WHOLE_SIZE;
9019 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009020 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9021 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022 m_errorMonitor->VerifyFound();
9023 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009026 buf_barrier.offset = 257;
9027 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009028 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9029 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009030 m_errorMonitor->VerifyFound();
9031 buf_barrier.offset = 0;
9032
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009034 buf_barrier.size = 257;
9035 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9037 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009038 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009039
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009040 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009041 m_errorMonitor->SetDesiredFailureMsg(
9042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009043 "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 -06009044 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009045 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009046 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009047 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9048 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009049 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009050
9051 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009052 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009053 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9054 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009055 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009056
9057 // Having anything other than DEPTH or STENCIL is an error
9058 m_errorMonitor->SetDesiredFailureMsg(
9059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9060 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9061 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9062 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9063 nullptr, 0, nullptr, 1, &img_barrier);
9064 m_errorMonitor->VerifyFound();
9065
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009066 // Now test depth-only
9067 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9069 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009070 VkDepthStencilObj d_image(m_device);
9071 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9072 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009073 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009074 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009075 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009076
9077 // DEPTH bit must be set
9078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9079 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009080 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009081 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9082 0, nullptr, 0, nullptr, 1, &img_barrier);
9083 m_errorMonitor->VerifyFound();
9084
9085 // No bits other than DEPTH may be set
9086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9087 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9088 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009089 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9090 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009091 m_errorMonitor->VerifyFound();
9092 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009093
9094 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009095 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9096 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009097 VkDepthStencilObj s_image(m_device);
9098 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9099 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009100 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009101 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009102 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009103 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9105 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009106 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009107 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9108 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009109 m_errorMonitor->VerifyFound();
9110 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009111
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009112 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009113 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009114 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009115 ASSERT_TRUE(c_image.initialized());
9116 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9117 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9118 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009119
9120 // COLOR bit must be set
9121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9122 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009123 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009124 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9125 nullptr, 0, nullptr, 1, &img_barrier);
9126 m_errorMonitor->VerifyFound();
9127
9128 // No bits other than COLOR may be set
9129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9130 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9131 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009132 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9133 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009134 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009135
Mike Weiblene6e01172017-03-07 22:18:40 -07009136 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9137 {
9138 VkImageObj img_color(m_device);
9139 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9140 ASSERT_TRUE(img_color.initialized());
9141
9142 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009143 img_ds.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009144 ASSERT_TRUE(img_ds.initialized());
9145
9146 VkImageObj img_xfer_src(m_device);
9147 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9148 ASSERT_TRUE(img_xfer_src.initialized());
9149
9150 VkImageObj img_xfer_dst(m_device);
9151 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9152 ASSERT_TRUE(img_xfer_dst.initialized());
9153
9154 VkImageObj img_sampled(m_device);
9155 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9156 ASSERT_TRUE(img_sampled.initialized());
9157
9158 VkImageObj img_input(m_device);
9159 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9160 ASSERT_TRUE(img_input.initialized());
9161
9162 const struct {
9163 VkImageObj &image_obj;
9164 VkImageLayout bad_layout;
9165 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9166 } bad_buffer_layouts[] = {
9167 // clang-format off
9168 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9169 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9170 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9171 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9172 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9173 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9174 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9175 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9176 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9177 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9178 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9179 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9180 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9181 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9182 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9183 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9184 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9185 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9186 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9187 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9188 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9189 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9190 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9191 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9192 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9193 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9194 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9195 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9196 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9197 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9198 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9199 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9200 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9201 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9202 // clang-format on
9203 };
9204 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9205
9206 for (uint32_t i = 0; i < layout_count; ++i) {
9207 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9208 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9209 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9210 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9211 : VK_IMAGE_ASPECT_COLOR_BIT;
9212
9213 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9214 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9216 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9217 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9218 m_errorMonitor->VerifyFound();
9219
9220 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9221 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9223 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9224 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9225 m_errorMonitor->VerifyFound();
9226 }
9227
9228 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9229 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9230 }
9231
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009232 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9233
9234 // Create command pool with incompatible queueflags
9235 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009236 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009237 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009238 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009239 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009240 }
9241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9242
9243 VkCommandPool command_pool;
9244 VkCommandPoolCreateInfo pool_create_info{};
9245 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9246 pool_create_info.queueFamilyIndex = queue_family_index;
9247 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9248 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9249
9250 // Allocate a command buffer
9251 VkCommandBuffer bad_command_buffer;
9252 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9253 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9254 command_buffer_allocate_info.commandPool = command_pool;
9255 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9256 command_buffer_allocate_info.commandBufferCount = 1;
9257 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9258
9259 VkCommandBufferBeginInfo cbbi = {};
9260 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9261 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9262 buf_barrier.offset = 0;
9263 buf_barrier.size = VK_WHOLE_SIZE;
9264 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9265 &buf_barrier, 0, nullptr);
9266 m_errorMonitor->VerifyFound();
9267
9268 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9269 vkEndCommandBuffer(bad_command_buffer);
9270 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009271 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009272 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009273 }
9274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9275 VkEvent event;
9276 VkEventCreateInfo event_create_info{};
9277 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9278 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9279 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9280 nullptr, 0, nullptr);
9281 m_errorMonitor->VerifyFound();
9282
9283 vkEndCommandBuffer(bad_command_buffer);
9284 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009285}
9286
Tony Barbour18ba25c2016-09-29 13:42:40 -06009287TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9288 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9289
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009291 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009292 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009293 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9294 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009295 ASSERT_TRUE(image.initialized());
9296
9297 VkImageMemoryBarrier barrier = {};
9298 VkImageSubresourceRange range;
9299 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9300 barrier.srcAccessMask = 0;
9301 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9302 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9303 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9304 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9305 barrier.image = image.handle();
9306 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9307 range.baseMipLevel = 0;
9308 range.levelCount = 1;
9309 range.baseArrayLayer = 0;
9310 range.layerCount = 1;
9311 barrier.subresourceRange = range;
9312 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9313 cmdbuf.BeginCommandBuffer();
9314 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9315 &barrier);
9316 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9317 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9318 barrier.srcAccessMask = 0;
9319 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9320 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9321 &barrier);
9322
9323 m_errorMonitor->VerifyFound();
9324}
9325
Karl Schultz6addd812016-02-02 17:17:23 -07009326TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009327 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009328 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009330
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009331 uint32_t const indices[] = {0};
9332 VkBufferCreateInfo buf_info = {};
9333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9334 buf_info.size = 1024;
9335 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9336 buf_info.queueFamilyIndexCount = 1;
9337 buf_info.pQueueFamilyIndices = indices;
9338
9339 VkBuffer buffer;
9340 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9341 ASSERT_VK_SUCCESS(err);
9342
9343 VkMemoryRequirements requirements;
9344 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9345
9346 VkMemoryAllocateInfo alloc_info{};
9347 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9348 alloc_info.pNext = NULL;
9349 alloc_info.memoryTypeIndex = 0;
9350 alloc_info.allocationSize = requirements.size;
9351 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9352 ASSERT_TRUE(pass);
9353
9354 VkDeviceMemory memory;
9355 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9356 ASSERT_VK_SUCCESS(err);
9357
9358 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009359 ASSERT_VK_SUCCESS(err);
9360
Tony Barbour552f6c02016-12-21 14:34:07 -07009361 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009362 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009363
Karl Schultz6addd812016-02-02 17:17:23 -07009364 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9365 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009366 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9368 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009369 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009370
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009371 vkFreeMemory(m_device->device(), memory, NULL);
9372 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009373}
9374
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009375TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9376 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009377 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9379 VkBufferCreateInfo buffCI = {};
9380 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9381 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009382 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009383 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009384 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009385 uint32_t qfi[2];
9386 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009387 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009388
9389 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009390 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009391
9392 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9394 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9395 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009396 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009397 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009398
9399 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009400 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9402
9403 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9404 buffCI.queueFamilyIndexCount = 2;
9405 qfi[0] = 1;
9406 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009407 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009408 VkDeviceMemory mem;
9409 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009410 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009411
9412 VkMemoryAllocateInfo alloc_info = {};
9413 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9414 alloc_info.allocationSize = 1024;
9415 bool pass = false;
9416 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9417 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009418 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009419 return;
9420 }
9421 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009422 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009423
9424 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009425 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009426 m_commandBuffer->end();
9427 QueueCommandBuffer(false);
9428 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009429 vkDestroyBuffer(m_device->device(), ib2, NULL);
9430 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009431 }
9432
Tony Barbourdf4c0042016-06-01 15:55:43 -06009433 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009434}
9435
Karl Schultz6addd812016-02-02 17:17:23 -07009436TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009437 TEST_DESCRIPTION(
9438 "Attempt vkCmdExecuteCommands with a primary command buffer"
9439 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009440
Tony Barbour1fa09702017-03-16 12:09:08 -06009441 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009443
Chris Forbesf29a84f2016-10-06 18:39:28 +13009444 // An empty primary command buffer
9445 VkCommandBufferObj cb(m_device, m_commandPool);
9446 cb.BeginCommandBuffer();
9447 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009448
Chris Forbesf29a84f2016-10-06 18:39:28 +13009449 m_commandBuffer->BeginCommandBuffer();
9450 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9451 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009452
Chris Forbesf29a84f2016-10-06 18:39:28 +13009453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9454 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009455 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009456
9457 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009458}
9459
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009460TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009461 TEST_DESCRIPTION(
9462 "Attempt to update descriptor sets for images and buffers "
9463 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009464 VkResult err;
9465
Tony Barbour1fa09702017-03-16 12:09:08 -06009466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009467 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9468 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9469 ds_type_count[i].type = VkDescriptorType(i);
9470 ds_type_count[i].descriptorCount = 1;
9471 }
9472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9474 ds_pool_ci.pNext = NULL;
9475 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9476 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9477 ds_pool_ci.pPoolSizes = ds_type_count;
9478
9479 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009480 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009481 ASSERT_VK_SUCCESS(err);
9482
9483 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009484 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009485 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9486 dsl_binding[i].binding = 0;
9487 dsl_binding[i].descriptorType = VkDescriptorType(i);
9488 dsl_binding[i].descriptorCount = 1;
9489 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9490 dsl_binding[i].pImmutableSamplers = NULL;
9491 }
9492
9493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9495 ds_layout_ci.pNext = NULL;
9496 ds_layout_ci.bindingCount = 1;
9497 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9498 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9499 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009501 ASSERT_VK_SUCCESS(err);
9502 }
9503 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9504 VkDescriptorSetAllocateInfo alloc_info = {};
9505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9506 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9507 alloc_info.descriptorPool = ds_pool;
9508 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009510 ASSERT_VK_SUCCESS(err);
9511
9512 // Create a buffer & bufferView to be used for invalid updates
9513 VkBufferCreateInfo buff_ci = {};
9514 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009515 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009516 buff_ci.size = 256;
9517 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009518 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009519 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9520 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009521
9522 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9523 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9524 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9525 ASSERT_VK_SUCCESS(err);
9526
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009527 VkMemoryRequirements mem_reqs;
9528 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9529 VkMemoryAllocateInfo mem_alloc_info = {};
9530 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9531 mem_alloc_info.pNext = NULL;
9532 mem_alloc_info.memoryTypeIndex = 0;
9533 mem_alloc_info.allocationSize = mem_reqs.size;
9534 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9535 if (!pass) {
9536 vkDestroyBuffer(m_device->device(), buffer, NULL);
9537 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9538 return;
9539 }
9540 VkDeviceMemory mem;
9541 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9542 ASSERT_VK_SUCCESS(err);
9543 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9544 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009545
9546 VkBufferViewCreateInfo buff_view_ci = {};
9547 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9548 buff_view_ci.buffer = buffer;
9549 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9550 buff_view_ci.range = VK_WHOLE_SIZE;
9551 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009552 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009553 ASSERT_VK_SUCCESS(err);
9554
Tony Barbour415497c2017-01-24 10:06:09 -07009555 // Now get resources / view for storage_texel_buffer
9556 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9557 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9558 if (!pass) {
9559 vkDestroyBuffer(m_device->device(), buffer, NULL);
9560 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9561 vkFreeMemory(m_device->device(), mem, NULL);
9562 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9563 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9564 return;
9565 }
9566 VkDeviceMemory storage_texel_buffer_mem;
9567 VkBufferView storage_texel_buffer_view;
9568 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9569 ASSERT_VK_SUCCESS(err);
9570 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9571 ASSERT_VK_SUCCESS(err);
9572 buff_view_ci.buffer = storage_texel_buffer;
9573 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9574 ASSERT_VK_SUCCESS(err);
9575
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009576 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009577 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009578 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009579 image_ci.format = VK_FORMAT_UNDEFINED;
9580 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9581 VkFormat format = static_cast<VkFormat>(f);
9582 VkFormatProperties fProps = m_device->format_properties(format);
9583 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9584 image_ci.format = format;
9585 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9586 break;
9587 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9588 image_ci.format = format;
9589 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9590 break;
9591 }
9592 }
9593 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9594 return;
9595 }
9596
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009597 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9598 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009599 image_ci.extent.width = 64;
9600 image_ci.extent.height = 64;
9601 image_ci.extent.depth = 1;
9602 image_ci.mipLevels = 1;
9603 image_ci.arrayLayers = 1;
9604 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009605 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009606 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009607 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9608 VkImage image;
9609 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9610 ASSERT_VK_SUCCESS(err);
9611 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009612 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009613
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009614 VkMemoryAllocateInfo mem_alloc = {};
9615 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9616 mem_alloc.pNext = NULL;
9617 mem_alloc.allocationSize = 0;
9618 mem_alloc.memoryTypeIndex = 0;
9619 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9620 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009621 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009622 ASSERT_TRUE(pass);
9623 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9624 ASSERT_VK_SUCCESS(err);
9625 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9626 ASSERT_VK_SUCCESS(err);
9627 // Now create view for image
9628 VkImageViewCreateInfo image_view_ci = {};
9629 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9630 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009631 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009632 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9633 image_view_ci.subresourceRange.layerCount = 1;
9634 image_view_ci.subresourceRange.baseArrayLayer = 0;
9635 image_view_ci.subresourceRange.levelCount = 1;
9636 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9637 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009638 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009639 ASSERT_VK_SUCCESS(err);
9640
9641 VkDescriptorBufferInfo buff_info = {};
9642 buff_info.buffer = buffer;
9643 VkDescriptorImageInfo img_info = {};
9644 img_info.imageView = image_view;
9645 VkWriteDescriptorSet descriptor_write = {};
9646 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9647 descriptor_write.dstBinding = 0;
9648 descriptor_write.descriptorCount = 1;
9649 descriptor_write.pTexelBufferView = &buff_view;
9650 descriptor_write.pBufferInfo = &buff_info;
9651 descriptor_write.pImageInfo = &img_info;
9652
9653 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009654 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009655 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9656 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9657 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9658 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9659 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9660 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9661 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9662 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9663 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9664 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9665 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009666 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009667 // Start loop at 1 as SAMPLER desc type has no usage bit error
9668 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009669 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9670 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9671 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9672 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009673 descriptor_write.descriptorType = VkDescriptorType(i);
9674 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009676
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009677 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009678
9679 m_errorMonitor->VerifyFound();
9680 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009681 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9682 descriptor_write.pTexelBufferView = &buff_view;
9683 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009684 }
Tony Barbour415497c2017-01-24 10:06:09 -07009685
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009686 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9687 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009688 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009689 vkDestroyImageView(m_device->device(), image_view, NULL);
9690 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009691 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009692 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009693 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009694 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009695 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9697}
9698
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009699TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009700 TEST_DESCRIPTION(
9701 "Attempt to update buffer descriptor set that has incorrect "
9702 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009703 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009704 "2. range value of 0\n"
9705 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009706 VkResult err;
9707
Tony Barbour1fa09702017-03-16 12:09:08 -06009708 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009709 VkDescriptorPoolSize ds_type_count = {};
9710 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9711 ds_type_count.descriptorCount = 1;
9712
9713 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9714 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9715 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009716 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009717 ds_pool_ci.maxSets = 1;
9718 ds_pool_ci.poolSizeCount = 1;
9719 ds_pool_ci.pPoolSizes = &ds_type_count;
9720
9721 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009722 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009723 ASSERT_VK_SUCCESS(err);
9724
9725 // Create layout with single uniform buffer descriptor
9726 VkDescriptorSetLayoutBinding dsl_binding = {};
9727 dsl_binding.binding = 0;
9728 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9729 dsl_binding.descriptorCount = 1;
9730 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9731 dsl_binding.pImmutableSamplers = NULL;
9732
9733 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9734 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9735 ds_layout_ci.pNext = NULL;
9736 ds_layout_ci.bindingCount = 1;
9737 ds_layout_ci.pBindings = &dsl_binding;
9738 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009739 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009740 ASSERT_VK_SUCCESS(err);
9741
9742 VkDescriptorSet descriptor_set = {};
9743 VkDescriptorSetAllocateInfo alloc_info = {};
9744 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9745 alloc_info.descriptorSetCount = 1;
9746 alloc_info.descriptorPool = ds_pool;
9747 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009748 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009749 ASSERT_VK_SUCCESS(err);
9750
9751 // Create a buffer to be used for invalid updates
9752 VkBufferCreateInfo buff_ci = {};
9753 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9754 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009755 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009756 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9757 VkBuffer buffer;
9758 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9759 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009760
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009761 // Have to bind memory to buffer before descriptor update
9762 VkMemoryAllocateInfo mem_alloc = {};
9763 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9764 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009765 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009766 mem_alloc.memoryTypeIndex = 0;
9767
9768 VkMemoryRequirements mem_reqs;
9769 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009770 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009771 if (!pass) {
9772 vkDestroyBuffer(m_device->device(), buffer, NULL);
9773 return;
9774 }
9775
9776 VkDeviceMemory mem;
9777 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9778 ASSERT_VK_SUCCESS(err);
9779 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9780 ASSERT_VK_SUCCESS(err);
9781
9782 VkDescriptorBufferInfo buff_info = {};
9783 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009784 // Cause error due to offset out of range
9785 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009786 buff_info.range = VK_WHOLE_SIZE;
9787 VkWriteDescriptorSet descriptor_write = {};
9788 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9789 descriptor_write.dstBinding = 0;
9790 descriptor_write.descriptorCount = 1;
9791 descriptor_write.pTexelBufferView = nullptr;
9792 descriptor_write.pBufferInfo = &buff_info;
9793 descriptor_write.pImageInfo = nullptr;
9794
9795 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9796 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009798
9799 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9800
9801 m_errorMonitor->VerifyFound();
9802 // Now cause error due to range of 0
9803 buff_info.offset = 0;
9804 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009806
9807 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9808
9809 m_errorMonitor->VerifyFound();
9810 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009811 buff_info.offset = 0;
9812 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009814
9815 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9816
9817 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009818 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9820 vkDestroyBuffer(m_device->device(), buffer, NULL);
9821 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9822 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9823}
9824
Tobin Ehlis845887e2017-02-02 19:01:44 -07009825TEST_F(VkLayerTest, DSBufferLimitErrors) {
9826 TEST_DESCRIPTION(
9827 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9828 "Test cases include:\n"
9829 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9830 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9831 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9832 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9833 VkResult err;
9834
Tony Barbour1fa09702017-03-16 12:09:08 -06009835 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009836 VkDescriptorPoolSize ds_type_count[2] = {};
9837 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9838 ds_type_count[0].descriptorCount = 1;
9839 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9840 ds_type_count[1].descriptorCount = 1;
9841
9842 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9843 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9844 ds_pool_ci.pNext = NULL;
9845 ds_pool_ci.maxSets = 1;
9846 ds_pool_ci.poolSizeCount = 2;
9847 ds_pool_ci.pPoolSizes = ds_type_count;
9848
9849 VkDescriptorPool ds_pool;
9850 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9851 ASSERT_VK_SUCCESS(err);
9852
9853 // Create layout with single uniform buffer & single storage buffer descriptor
9854 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9855 dsl_binding[0].binding = 0;
9856 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9857 dsl_binding[0].descriptorCount = 1;
9858 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9859 dsl_binding[0].pImmutableSamplers = NULL;
9860 dsl_binding[1].binding = 1;
9861 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9862 dsl_binding[1].descriptorCount = 1;
9863 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9864 dsl_binding[1].pImmutableSamplers = NULL;
9865
9866 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9867 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9868 ds_layout_ci.pNext = NULL;
9869 ds_layout_ci.bindingCount = 2;
9870 ds_layout_ci.pBindings = dsl_binding;
9871 VkDescriptorSetLayout ds_layout;
9872 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9873 ASSERT_VK_SUCCESS(err);
9874
9875 VkDescriptorSet descriptor_set = {};
9876 VkDescriptorSetAllocateInfo alloc_info = {};
9877 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9878 alloc_info.descriptorSetCount = 1;
9879 alloc_info.descriptorPool = ds_pool;
9880 alloc_info.pSetLayouts = &ds_layout;
9881 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9882 ASSERT_VK_SUCCESS(err);
9883
9884 // Create a buffer to be used for invalid updates
9885 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9886 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9887 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9888 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9889 VkBufferCreateInfo ub_ci = {};
9890 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9891 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9892 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9893 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9894 VkBuffer uniform_buffer;
9895 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9896 ASSERT_VK_SUCCESS(err);
9897 VkBufferCreateInfo sb_ci = {};
9898 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9899 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9900 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9901 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9902 VkBuffer storage_buffer;
9903 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9904 ASSERT_VK_SUCCESS(err);
9905 // Have to bind memory to buffer before descriptor update
9906 VkMemoryAllocateInfo mem_alloc = {};
9907 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9908 mem_alloc.pNext = NULL;
9909 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9910 mem_alloc.memoryTypeIndex = 0;
9911
Cort Stratton77a0d592017-02-17 13:14:13 -08009912 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9913 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9914 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9915 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9916 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009917 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009918 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009919 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009920 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9921 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009922 return;
9923 }
9924
9925 VkDeviceMemory mem;
9926 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009927 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009928 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9930 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9931 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9932 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9933 return;
9934 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009935 ASSERT_VK_SUCCESS(err);
9936 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9937 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009938 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009939 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9940 ASSERT_VK_SUCCESS(err);
9941
9942 VkDescriptorBufferInfo buff_info = {};
9943 buff_info.buffer = uniform_buffer;
9944 buff_info.range = ub_ci.size; // This will exceed limit
9945 VkWriteDescriptorSet descriptor_write = {};
9946 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9947 descriptor_write.dstBinding = 0;
9948 descriptor_write.descriptorCount = 1;
9949 descriptor_write.pTexelBufferView = nullptr;
9950 descriptor_write.pBufferInfo = &buff_info;
9951 descriptor_write.pImageInfo = nullptr;
9952
9953 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9954 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009955 if (max_ub_range != UINT32_MAX) {
9956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9957 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9958 m_errorMonitor->VerifyFound();
9959 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009960 // Reduce size of range to acceptable limit & cause offset error
9961 buff_info.range = max_ub_range;
9962 buff_info.offset = min_ub_align - 1;
9963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9964 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9965 m_errorMonitor->VerifyFound();
9966
9967 // Now break storage updates
9968 buff_info.buffer = storage_buffer;
9969 buff_info.range = sb_ci.size; // This will exceed limit
9970 buff_info.offset = 0; // Reset offset for this update
9971
9972 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9973 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009974 if (max_ub_range != UINT32_MAX) {
9975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9976 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9977 m_errorMonitor->VerifyFound();
9978 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009979
9980 // Reduce size of range to acceptable limit & cause offset error
9981 buff_info.range = max_sb_range;
9982 buff_info.offset = min_sb_align - 1;
9983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9984 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9985 m_errorMonitor->VerifyFound();
9986
9987 vkFreeMemory(m_device->device(), mem, NULL);
9988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9989 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9990 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9991 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9992}
9993
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009994TEST_F(VkLayerTest, DSAspectBitsErrors) {
9995 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9996 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009997 TEST_DESCRIPTION(
9998 "Attempt to update descriptor sets for images "
9999 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010000 VkResult err;
10001
Tony Barbour1fa09702017-03-16 12:09:08 -060010002 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010003 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010004 if (!depth_format) {
10005 printf(" No Depth + Stencil format found. Skipped.\n");
10006 return;
10007 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010008 VkDescriptorPoolSize ds_type_count = {};
10009 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10010 ds_type_count.descriptorCount = 1;
10011
10012 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10013 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10014 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010015 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010016 ds_pool_ci.maxSets = 5;
10017 ds_pool_ci.poolSizeCount = 1;
10018 ds_pool_ci.pPoolSizes = &ds_type_count;
10019
10020 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010021 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010022 ASSERT_VK_SUCCESS(err);
10023
10024 VkDescriptorSetLayoutBinding dsl_binding = {};
10025 dsl_binding.binding = 0;
10026 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10027 dsl_binding.descriptorCount = 1;
10028 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10029 dsl_binding.pImmutableSamplers = NULL;
10030
10031 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10032 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10033 ds_layout_ci.pNext = NULL;
10034 ds_layout_ci.bindingCount = 1;
10035 ds_layout_ci.pBindings = &dsl_binding;
10036 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010037 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010038 ASSERT_VK_SUCCESS(err);
10039
10040 VkDescriptorSet descriptor_set = {};
10041 VkDescriptorSetAllocateInfo alloc_info = {};
10042 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10043 alloc_info.descriptorSetCount = 1;
10044 alloc_info.descriptorPool = ds_pool;
10045 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010046 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010047 ASSERT_VK_SUCCESS(err);
10048
10049 // Create an image to be used for invalid updates
10050 VkImageCreateInfo image_ci = {};
10051 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10052 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010053 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010054 image_ci.extent.width = 64;
10055 image_ci.extent.height = 64;
10056 image_ci.extent.depth = 1;
10057 image_ci.mipLevels = 1;
10058 image_ci.arrayLayers = 1;
10059 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010060 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010061 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10062 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10063 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10064 VkImage image;
10065 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10066 ASSERT_VK_SUCCESS(err);
10067 // Bind memory to image
10068 VkMemoryRequirements mem_reqs;
10069 VkDeviceMemory image_mem;
10070 bool pass;
10071 VkMemoryAllocateInfo mem_alloc = {};
10072 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10073 mem_alloc.pNext = NULL;
10074 mem_alloc.allocationSize = 0;
10075 mem_alloc.memoryTypeIndex = 0;
10076 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10077 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010078 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010079 ASSERT_TRUE(pass);
10080 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10081 ASSERT_VK_SUCCESS(err);
10082 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10083 ASSERT_VK_SUCCESS(err);
10084 // Now create view for image
10085 VkImageViewCreateInfo image_view_ci = {};
10086 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10087 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010088 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010089 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10090 image_view_ci.subresourceRange.layerCount = 1;
10091 image_view_ci.subresourceRange.baseArrayLayer = 0;
10092 image_view_ci.subresourceRange.levelCount = 1;
10093 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010094 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010095
10096 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010097 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010098 ASSERT_VK_SUCCESS(err);
10099
10100 VkDescriptorImageInfo img_info = {};
10101 img_info.imageView = image_view;
10102 VkWriteDescriptorSet descriptor_write = {};
10103 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10104 descriptor_write.dstBinding = 0;
10105 descriptor_write.descriptorCount = 1;
10106 descriptor_write.pTexelBufferView = NULL;
10107 descriptor_write.pBufferInfo = NULL;
10108 descriptor_write.pImageInfo = &img_info;
10109 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10110 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010111 const char *error_msg =
10112 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10113 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010115
10116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10117
10118 m_errorMonitor->VerifyFound();
10119 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10120 vkDestroyImage(m_device->device(), image, NULL);
10121 vkFreeMemory(m_device->device(), image_mem, NULL);
10122 vkDestroyImageView(m_device->device(), image_view, NULL);
10123 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10125}
10126
Karl Schultz6addd812016-02-02 17:17:23 -070010127TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010128 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010129 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010130
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10132 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10133 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010134
Tony Barbour1fa09702017-03-16 12:09:08 -060010135 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010136 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010137 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010138 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10139 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010140
10141 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010142 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10143 ds_pool_ci.pNext = NULL;
10144 ds_pool_ci.maxSets = 1;
10145 ds_pool_ci.poolSizeCount = 1;
10146 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010147
Tobin Ehlis3b780662015-05-28 12:11:26 -060010148 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010149 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010151 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010152 dsl_binding.binding = 0;
10153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10154 dsl_binding.descriptorCount = 1;
10155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10156 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010157
Tony Barboureb254902015-07-15 12:50:33 -060010158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10160 ds_layout_ci.pNext = NULL;
10161 ds_layout_ci.bindingCount = 1;
10162 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010163
Tobin Ehlis3b780662015-05-28 12:11:26 -060010164 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010165 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010166 ASSERT_VK_SUCCESS(err);
10167
10168 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010169 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010170 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010171 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010172 alloc_info.descriptorPool = ds_pool;
10173 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010174 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010175 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010176
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010177 VkSamplerCreateInfo sampler_ci = {};
10178 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10179 sampler_ci.pNext = NULL;
10180 sampler_ci.magFilter = VK_FILTER_NEAREST;
10181 sampler_ci.minFilter = VK_FILTER_NEAREST;
10182 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10183 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10184 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10185 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10186 sampler_ci.mipLodBias = 1.0;
10187 sampler_ci.anisotropyEnable = VK_FALSE;
10188 sampler_ci.maxAnisotropy = 1;
10189 sampler_ci.compareEnable = VK_FALSE;
10190 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10191 sampler_ci.minLod = 1.0;
10192 sampler_ci.maxLod = 1.0;
10193 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10194 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10195 VkSampler sampler;
10196 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10197 ASSERT_VK_SUCCESS(err);
10198
10199 VkDescriptorImageInfo info = {};
10200 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010201
10202 VkWriteDescriptorSet descriptor_write;
10203 memset(&descriptor_write, 0, sizeof(descriptor_write));
10204 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010205 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010206 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010207 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010208 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010209 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010210
10211 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10212
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010213 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010214
Chia-I Wuf7458c52015-10-26 21:10:41 +080010215 vkDestroySampler(m_device->device(), sampler, NULL);
10216 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10217 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010218}
10219
Karl Schultz6addd812016-02-02 17:17:23 -070010220TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010221 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010222 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010223
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010225
Tony Barbour1fa09702017-03-16 12:09:08 -060010226 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010227 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010228 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010229 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10230 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010231
10232 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010233 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10234 ds_pool_ci.pNext = NULL;
10235 ds_pool_ci.maxSets = 1;
10236 ds_pool_ci.poolSizeCount = 1;
10237 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010238
Tobin Ehlis3b780662015-05-28 12:11:26 -060010239 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010240 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010241 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010242
Tony Barboureb254902015-07-15 12:50:33 -060010243 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010244 dsl_binding.binding = 0;
10245 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10246 dsl_binding.descriptorCount = 1;
10247 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10248 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010249
10250 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010251 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10252 ds_layout_ci.pNext = NULL;
10253 ds_layout_ci.bindingCount = 1;
10254 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010255
Tobin Ehlis3b780662015-05-28 12:11:26 -060010256 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010257 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010258 ASSERT_VK_SUCCESS(err);
10259
10260 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010261 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010262 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010263 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010264 alloc_info.descriptorPool = ds_pool;
10265 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010266 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010267 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010268
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010269 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10270
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010271 // Correctly update descriptor to avoid "NOT_UPDATED" error
10272 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010273 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010274 buff_info.offset = 0;
10275 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010276
10277 VkWriteDescriptorSet descriptor_write;
10278 memset(&descriptor_write, 0, sizeof(descriptor_write));
10279 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010280 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010281 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010282 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010283 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10284 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010285
10286 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10287
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010288 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010289
Chia-I Wuf7458c52015-10-26 21:10:41 +080010290 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10291 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010292}
10293
Karl Schultz6addd812016-02-02 17:17:23 -070010294TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010295 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010296 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010297
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010299
Tony Barbour1fa09702017-03-16 12:09:08 -060010300 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010301 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010302 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010303 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10304 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010305
10306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10308 ds_pool_ci.pNext = NULL;
10309 ds_pool_ci.maxSets = 1;
10310 ds_pool_ci.poolSizeCount = 1;
10311 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010312
Tobin Ehlis3b780662015-05-28 12:11:26 -060010313 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010315 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010316
Tony Barboureb254902015-07-15 12:50:33 -060010317 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010318 dsl_binding.binding = 0;
10319 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10320 dsl_binding.descriptorCount = 1;
10321 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10322 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010323
10324 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010325 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10326 ds_layout_ci.pNext = NULL;
10327 ds_layout_ci.bindingCount = 1;
10328 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010329 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010330 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010331 ASSERT_VK_SUCCESS(err);
10332
10333 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010334 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010335 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010336 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010337 alloc_info.descriptorPool = ds_pool;
10338 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010339 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010340 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010341
Tony Barboureb254902015-07-15 12:50:33 -060010342 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010343 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10344 sampler_ci.pNext = NULL;
10345 sampler_ci.magFilter = VK_FILTER_NEAREST;
10346 sampler_ci.minFilter = VK_FILTER_NEAREST;
10347 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10348 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10349 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10350 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10351 sampler_ci.mipLodBias = 1.0;
10352 sampler_ci.anisotropyEnable = VK_FALSE;
10353 sampler_ci.maxAnisotropy = 1;
10354 sampler_ci.compareEnable = VK_FALSE;
10355 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10356 sampler_ci.minLod = 1.0;
10357 sampler_ci.maxLod = 1.0;
10358 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10359 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010360
Tobin Ehlis3b780662015-05-28 12:11:26 -060010361 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010362 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010363 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010364
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010365 VkDescriptorImageInfo info = {};
10366 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010367
10368 VkWriteDescriptorSet descriptor_write;
10369 memset(&descriptor_write, 0, sizeof(descriptor_write));
10370 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010371 descriptor_write.dstSet = descriptorSet;
10372 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010373 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010374 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010375 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010376 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010377
10378 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010380 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010381
Chia-I Wuf7458c52015-10-26 21:10:41 +080010382 vkDestroySampler(m_device->device(), sampler, NULL);
10383 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10384 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010385}
10386
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010387TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10388 // Create layout w/ empty binding and attempt to update it
10389 VkResult err;
10390
Tony Barbour1fa09702017-03-16 12:09:08 -060010391 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010392
10393 VkDescriptorPoolSize ds_type_count = {};
10394 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10395 ds_type_count.descriptorCount = 1;
10396
10397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10399 ds_pool_ci.pNext = NULL;
10400 ds_pool_ci.maxSets = 1;
10401 ds_pool_ci.poolSizeCount = 1;
10402 ds_pool_ci.pPoolSizes = &ds_type_count;
10403
10404 VkDescriptorPool ds_pool;
10405 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10406 ASSERT_VK_SUCCESS(err);
10407
10408 VkDescriptorSetLayoutBinding dsl_binding = {};
10409 dsl_binding.binding = 0;
10410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10411 dsl_binding.descriptorCount = 0;
10412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10413 dsl_binding.pImmutableSamplers = NULL;
10414
10415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10417 ds_layout_ci.pNext = NULL;
10418 ds_layout_ci.bindingCount = 1;
10419 ds_layout_ci.pBindings = &dsl_binding;
10420 VkDescriptorSetLayout ds_layout;
10421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10422 ASSERT_VK_SUCCESS(err);
10423
10424 VkDescriptorSet descriptor_set;
10425 VkDescriptorSetAllocateInfo alloc_info = {};
10426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10427 alloc_info.descriptorSetCount = 1;
10428 alloc_info.descriptorPool = ds_pool;
10429 alloc_info.pSetLayouts = &ds_layout;
10430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10431 ASSERT_VK_SUCCESS(err);
10432
10433 VkSamplerCreateInfo sampler_ci = {};
10434 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10435 sampler_ci.magFilter = VK_FILTER_NEAREST;
10436 sampler_ci.minFilter = VK_FILTER_NEAREST;
10437 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10438 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10439 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10440 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10441 sampler_ci.mipLodBias = 1.0;
10442 sampler_ci.maxAnisotropy = 1;
10443 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10444 sampler_ci.minLod = 1.0;
10445 sampler_ci.maxLod = 1.0;
10446 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10447
10448 VkSampler sampler;
10449 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10450 ASSERT_VK_SUCCESS(err);
10451
10452 VkDescriptorImageInfo info = {};
10453 info.sampler = sampler;
10454
10455 VkWriteDescriptorSet descriptor_write;
10456 memset(&descriptor_write, 0, sizeof(descriptor_write));
10457 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10458 descriptor_write.dstSet = descriptor_set;
10459 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010460 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010461 // This is the wrong type, but empty binding error will be flagged first
10462 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10463 descriptor_write.pImageInfo = &info;
10464
10465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10466 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10467 m_errorMonitor->VerifyFound();
10468
10469 vkDestroySampler(m_device->device(), sampler, NULL);
10470 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10471 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10472}
10473
Karl Schultz6addd812016-02-02 17:17:23 -070010474TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10475 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10476 // types
10477 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010479 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 -060010480
Tony Barbour1fa09702017-03-16 12:09:08 -060010481 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010482
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010483 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010484 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10485 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010486
10487 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010488 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10489 ds_pool_ci.pNext = NULL;
10490 ds_pool_ci.maxSets = 1;
10491 ds_pool_ci.poolSizeCount = 1;
10492 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010493
Tobin Ehlis3b780662015-05-28 12:11:26 -060010494 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010496 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010497 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010498 dsl_binding.binding = 0;
10499 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10500 dsl_binding.descriptorCount = 1;
10501 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10502 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010503
Tony Barboureb254902015-07-15 12:50:33 -060010504 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010505 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10506 ds_layout_ci.pNext = NULL;
10507 ds_layout_ci.bindingCount = 1;
10508 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010509
Tobin Ehlis3b780662015-05-28 12:11:26 -060010510 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010511 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010512 ASSERT_VK_SUCCESS(err);
10513
10514 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010515 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010516 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010517 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010518 alloc_info.descriptorPool = ds_pool;
10519 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010520 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010521 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010522
Tony Barboureb254902015-07-15 12:50:33 -060010523 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010524 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10525 sampler_ci.pNext = NULL;
10526 sampler_ci.magFilter = VK_FILTER_NEAREST;
10527 sampler_ci.minFilter = VK_FILTER_NEAREST;
10528 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10529 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10530 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10531 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10532 sampler_ci.mipLodBias = 1.0;
10533 sampler_ci.anisotropyEnable = VK_FALSE;
10534 sampler_ci.maxAnisotropy = 1;
10535 sampler_ci.compareEnable = VK_FALSE;
10536 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10537 sampler_ci.minLod = 1.0;
10538 sampler_ci.maxLod = 1.0;
10539 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10540 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010541 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010542 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010543 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010544
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010545 VkDescriptorImageInfo info = {};
10546 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010547
10548 VkWriteDescriptorSet descriptor_write;
10549 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010550 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010551 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010552 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010553 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010554 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010555 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010556
10557 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10558
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010559 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010560
Chia-I Wuf7458c52015-10-26 21:10:41 +080010561 vkDestroySampler(m_device->device(), sampler, NULL);
10562 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10563 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010564}
10565
Karl Schultz6addd812016-02-02 17:17:23 -070010566TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010567 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010568 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010571
Tony Barbour1fa09702017-03-16 12:09:08 -060010572 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010573 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10574 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010575 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010576 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10577 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010578
10579 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010580 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10581 ds_pool_ci.pNext = NULL;
10582 ds_pool_ci.maxSets = 1;
10583 ds_pool_ci.poolSizeCount = 1;
10584 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010585
10586 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010587 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010588 ASSERT_VK_SUCCESS(err);
10589
10590 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010591 dsl_binding.binding = 0;
10592 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10593 dsl_binding.descriptorCount = 1;
10594 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10595 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010596
10597 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010598 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10599 ds_layout_ci.pNext = NULL;
10600 ds_layout_ci.bindingCount = 1;
10601 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010602 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010603 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010604 ASSERT_VK_SUCCESS(err);
10605
10606 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010607 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010608 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010609 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010610 alloc_info.descriptorPool = ds_pool;
10611 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010612 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010613 ASSERT_VK_SUCCESS(err);
10614
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010615 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010616
10617 VkDescriptorImageInfo descriptor_info;
10618 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10619 descriptor_info.sampler = sampler;
10620
10621 VkWriteDescriptorSet descriptor_write;
10622 memset(&descriptor_write, 0, sizeof(descriptor_write));
10623 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010624 descriptor_write.dstSet = descriptorSet;
10625 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010626 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010627 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10628 descriptor_write.pImageInfo = &descriptor_info;
10629
10630 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10631
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010632 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010633
Chia-I Wuf7458c52015-10-26 21:10:41 +080010634 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10635 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010636}
10637
Karl Schultz6addd812016-02-02 17:17:23 -070010638TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10639 // Create a single combined Image/Sampler descriptor and send it an invalid
10640 // imageView
10641 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010642
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010644
Tony Barbour1fa09702017-03-16 12:09:08 -060010645 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010646 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010647 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10648 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010649
10650 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010651 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10652 ds_pool_ci.pNext = NULL;
10653 ds_pool_ci.maxSets = 1;
10654 ds_pool_ci.poolSizeCount = 1;
10655 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656
10657 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010658 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010659 ASSERT_VK_SUCCESS(err);
10660
10661 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010662 dsl_binding.binding = 0;
10663 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10664 dsl_binding.descriptorCount = 1;
10665 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10666 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010667
10668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10670 ds_layout_ci.pNext = NULL;
10671 ds_layout_ci.bindingCount = 1;
10672 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010673 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010675 ASSERT_VK_SUCCESS(err);
10676
10677 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010678 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010679 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010680 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010681 alloc_info.descriptorPool = ds_pool;
10682 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010683 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010684 ASSERT_VK_SUCCESS(err);
10685
10686 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010687 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10688 sampler_ci.pNext = NULL;
10689 sampler_ci.magFilter = VK_FILTER_NEAREST;
10690 sampler_ci.minFilter = VK_FILTER_NEAREST;
10691 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10692 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10693 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10694 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10695 sampler_ci.mipLodBias = 1.0;
10696 sampler_ci.anisotropyEnable = VK_FALSE;
10697 sampler_ci.maxAnisotropy = 1;
10698 sampler_ci.compareEnable = VK_FALSE;
10699 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10700 sampler_ci.minLod = 1.0;
10701 sampler_ci.maxLod = 1.0;
10702 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10703 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010704
10705 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010706 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010707 ASSERT_VK_SUCCESS(err);
10708
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010709 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010710
10711 VkDescriptorImageInfo descriptor_info;
10712 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10713 descriptor_info.sampler = sampler;
10714 descriptor_info.imageView = view;
10715
10716 VkWriteDescriptorSet descriptor_write;
10717 memset(&descriptor_write, 0, sizeof(descriptor_write));
10718 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010719 descriptor_write.dstSet = descriptorSet;
10720 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010721 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010722 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10723 descriptor_write.pImageInfo = &descriptor_info;
10724
10725 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10726
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010727 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010728
Chia-I Wuf7458c52015-10-26 21:10:41 +080010729 vkDestroySampler(m_device->device(), sampler, NULL);
10730 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10731 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010732}
10733
Karl Schultz6addd812016-02-02 17:17:23 -070010734TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10735 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10736 // into the other
10737 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010738
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10740 " binding #1 with type "
10741 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10742 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010743
Tony Barbour1fa09702017-03-16 12:09:08 -060010744 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010745 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010746 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010747 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10748 ds_type_count[0].descriptorCount = 1;
10749 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10750 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010751
10752 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010753 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10754 ds_pool_ci.pNext = NULL;
10755 ds_pool_ci.maxSets = 1;
10756 ds_pool_ci.poolSizeCount = 2;
10757 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010758
10759 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010760 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010761 ASSERT_VK_SUCCESS(err);
10762 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010763 dsl_binding[0].binding = 0;
10764 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10765 dsl_binding[0].descriptorCount = 1;
10766 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10767 dsl_binding[0].pImmutableSamplers = NULL;
10768 dsl_binding[1].binding = 1;
10769 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10770 dsl_binding[1].descriptorCount = 1;
10771 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10772 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010773
10774 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010775 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10776 ds_layout_ci.pNext = NULL;
10777 ds_layout_ci.bindingCount = 2;
10778 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010779
10780 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010781 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010782 ASSERT_VK_SUCCESS(err);
10783
10784 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010785 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010786 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010787 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010788 alloc_info.descriptorPool = ds_pool;
10789 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010790 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010791 ASSERT_VK_SUCCESS(err);
10792
10793 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010794 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10795 sampler_ci.pNext = NULL;
10796 sampler_ci.magFilter = VK_FILTER_NEAREST;
10797 sampler_ci.minFilter = VK_FILTER_NEAREST;
10798 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10799 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10800 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10801 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10802 sampler_ci.mipLodBias = 1.0;
10803 sampler_ci.anisotropyEnable = VK_FALSE;
10804 sampler_ci.maxAnisotropy = 1;
10805 sampler_ci.compareEnable = VK_FALSE;
10806 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10807 sampler_ci.minLod = 1.0;
10808 sampler_ci.maxLod = 1.0;
10809 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10810 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010811
10812 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010813 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010814 ASSERT_VK_SUCCESS(err);
10815
10816 VkDescriptorImageInfo info = {};
10817 info.sampler = sampler;
10818
10819 VkWriteDescriptorSet descriptor_write;
10820 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10821 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010822 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010823 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010824 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010825 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10826 descriptor_write.pImageInfo = &info;
10827 // This write update should succeed
10828 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10829 // Now perform a copy update that fails due to type mismatch
10830 VkCopyDescriptorSet copy_ds_update;
10831 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10832 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10833 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010834 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010835 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010836 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10837 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010838 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10839
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010840 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010841 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010842 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 -060010843 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10844 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10845 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010846 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010847 copy_ds_update.dstSet = descriptorSet;
10848 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010849 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010850 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10851
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010852 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010853
Tobin Ehlis04356f92015-10-27 16:35:27 -060010854 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10856 " binding#1 with offset index of 1 plus "
10857 "update array offset of 0 and update of "
10858 "5 descriptors oversteps total number "
10859 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010860
Tobin Ehlis04356f92015-10-27 16:35:27 -060010861 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10862 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10863 copy_ds_update.srcSet = descriptorSet;
10864 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010865 copy_ds_update.dstSet = descriptorSet;
10866 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010867 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010868 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10869
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010870 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010871
Chia-I Wuf7458c52015-10-26 21:10:41 +080010872 vkDestroySampler(m_device->device(), sampler, NULL);
10873 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10874 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010875}
10876
Karl Schultz6addd812016-02-02 17:17:23 -070010877TEST_F(VkLayerTest, NumSamplesMismatch) {
10878 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10879 // sampleCount
10880 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010883
Tony Barbour1fa09702017-03-16 12:09:08 -060010884 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010886 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010887 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010888 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010889
10890 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010891 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10892 ds_pool_ci.pNext = NULL;
10893 ds_pool_ci.maxSets = 1;
10894 ds_pool_ci.poolSizeCount = 1;
10895 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010896
Tobin Ehlis3b780662015-05-28 12:11:26 -060010897 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010898 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010899 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900
Tony Barboureb254902015-07-15 12:50:33 -060010901 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010902 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010903 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010904 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010905 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10906 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010907
Tony Barboureb254902015-07-15 12:50:33 -060010908 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10909 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10910 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010911 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010912 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010913
Tobin Ehlis3b780662015-05-28 12:11:26 -060010914 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010915 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010916 ASSERT_VK_SUCCESS(err);
10917
10918 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010919 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010920 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010921 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010922 alloc_info.descriptorPool = ds_pool;
10923 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010924 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010925 ASSERT_VK_SUCCESS(err);
10926
Tony Barboureb254902015-07-15 12:50:33 -060010927 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010928 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010929 pipe_ms_state_ci.pNext = NULL;
10930 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10931 pipe_ms_state_ci.sampleShadingEnable = 0;
10932 pipe_ms_state_ci.minSampleShading = 1.0;
10933 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010934
Tony Barboureb254902015-07-15 12:50:33 -060010935 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010936 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10937 pipeline_layout_ci.pNext = NULL;
10938 pipeline_layout_ci.setLayoutCount = 1;
10939 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010940
10941 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010943 ASSERT_VK_SUCCESS(err);
10944
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010945 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010946 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 -060010947 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010948 VkPipelineObj pipe(m_device);
10949 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010950 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010951 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010952 pipe.SetMSAA(&pipe_ms_state_ci);
10953 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010954
Tony Barbour552f6c02016-12-21 14:34:07 -070010955 m_commandBuffer->BeginCommandBuffer();
10956 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010957 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010958
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010959 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10960 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10961 VkRect2D scissor = {{0, 0}, {16, 16}};
10962 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10963
Mark Young29927482016-05-04 14:38:51 -060010964 // Render triangle (the error should trigger on the attempt to draw).
10965 Draw(3, 1, 0, 0);
10966
10967 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010968 m_commandBuffer->EndRenderPass();
10969 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010970
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010971 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010972
Chia-I Wuf7458c52015-10-26 21:10:41 +080010973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010976}
Mark Young29927482016-05-04 14:38:51 -060010977
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010978TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010979 TEST_DESCRIPTION(
10980 "Hit RenderPass incompatible cases. "
10981 "Initial case is drawing with an active renderpass that's "
10982 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010983 VkResult err;
10984
Tony Barbour1fa09702017-03-16 12:09:08 -060010985 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10987
10988 VkDescriptorSetLayoutBinding dsl_binding = {};
10989 dsl_binding.binding = 0;
10990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10991 dsl_binding.descriptorCount = 1;
10992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10993 dsl_binding.pImmutableSamplers = NULL;
10994
10995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10997 ds_layout_ci.pNext = NULL;
10998 ds_layout_ci.bindingCount = 1;
10999 ds_layout_ci.pBindings = &dsl_binding;
11000
11001 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011002 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011003 ASSERT_VK_SUCCESS(err);
11004
11005 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11006 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11007 pipeline_layout_ci.pNext = NULL;
11008 pipeline_layout_ci.setLayoutCount = 1;
11009 pipeline_layout_ci.pSetLayouts = &ds_layout;
11010
11011 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011013 ASSERT_VK_SUCCESS(err);
11014
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011015 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011016 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 -060011017 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011018 // Create a renderpass that will be incompatible with default renderpass
11019 VkAttachmentReference attach = {};
11020 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11021 VkAttachmentReference color_att = {};
11022 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11023 VkSubpassDescription subpass = {};
11024 subpass.inputAttachmentCount = 1;
11025 subpass.pInputAttachments = &attach;
11026 subpass.colorAttachmentCount = 1;
11027 subpass.pColorAttachments = &color_att;
11028 VkRenderPassCreateInfo rpci = {};
11029 rpci.subpassCount = 1;
11030 rpci.pSubpasses = &subpass;
11031 rpci.attachmentCount = 1;
11032 VkAttachmentDescription attach_desc = {};
11033 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011034 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11035 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011036 rpci.pAttachments = &attach_desc;
11037 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11038 VkRenderPass rp;
11039 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11040 VkPipelineObj pipe(m_device);
11041 pipe.AddShader(&vs);
11042 pipe.AddShader(&fs);
11043 pipe.AddColorAttachment();
11044 VkViewport view_port = {};
11045 m_viewports.push_back(view_port);
11046 pipe.SetViewport(m_viewports);
11047 VkRect2D rect = {};
11048 m_scissors.push_back(rect);
11049 pipe.SetScissor(m_scissors);
11050 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11051
11052 VkCommandBufferInheritanceInfo cbii = {};
11053 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11054 cbii.renderPass = rp;
11055 cbii.subpass = 0;
11056 VkCommandBufferBeginInfo cbbi = {};
11057 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11058 cbbi.pInheritanceInfo = &cbii;
11059 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11060 VkRenderPassBeginInfo rpbi = {};
11061 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11062 rpbi.framebuffer = m_framebuffer;
11063 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011064 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11065 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011066
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011068 // Render triangle (the error should trigger on the attempt to draw).
11069 Draw(3, 1, 0, 0);
11070
11071 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011072 m_commandBuffer->EndRenderPass();
11073 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011074
11075 m_errorMonitor->VerifyFound();
11076
11077 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11078 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11079 vkDestroyRenderPass(m_device->device(), rp, NULL);
11080}
11081
Mark Youngc89c6312016-03-31 16:03:20 -060011082TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11083 // Create Pipeline where the number of blend attachments doesn't match the
11084 // number of color attachments. In this case, we don't add any color
11085 // blend attachments even though we have a color attachment.
11086 VkResult err;
11087
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011089
Tony Barbour1fa09702017-03-16 12:09:08 -060011090 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11092 VkDescriptorPoolSize ds_type_count = {};
11093 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11094 ds_type_count.descriptorCount = 1;
11095
11096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11098 ds_pool_ci.pNext = NULL;
11099 ds_pool_ci.maxSets = 1;
11100 ds_pool_ci.poolSizeCount = 1;
11101 ds_pool_ci.pPoolSizes = &ds_type_count;
11102
11103 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011104 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011105 ASSERT_VK_SUCCESS(err);
11106
11107 VkDescriptorSetLayoutBinding dsl_binding = {};
11108 dsl_binding.binding = 0;
11109 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11110 dsl_binding.descriptorCount = 1;
11111 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11112 dsl_binding.pImmutableSamplers = NULL;
11113
11114 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11115 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11116 ds_layout_ci.pNext = NULL;
11117 ds_layout_ci.bindingCount = 1;
11118 ds_layout_ci.pBindings = &dsl_binding;
11119
11120 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011122 ASSERT_VK_SUCCESS(err);
11123
11124 VkDescriptorSet descriptorSet;
11125 VkDescriptorSetAllocateInfo alloc_info = {};
11126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11127 alloc_info.descriptorSetCount = 1;
11128 alloc_info.descriptorPool = ds_pool;
11129 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011131 ASSERT_VK_SUCCESS(err);
11132
11133 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011135 pipe_ms_state_ci.pNext = NULL;
11136 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11137 pipe_ms_state_ci.sampleShadingEnable = 0;
11138 pipe_ms_state_ci.minSampleShading = 1.0;
11139 pipe_ms_state_ci.pSampleMask = NULL;
11140
11141 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11142 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11143 pipeline_layout_ci.pNext = NULL;
11144 pipeline_layout_ci.setLayoutCount = 1;
11145 pipeline_layout_ci.pSetLayouts = &ds_layout;
11146
11147 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011149 ASSERT_VK_SUCCESS(err);
11150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011151 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011152 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 -060011153 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011154 VkPipelineObj pipe(m_device);
11155 pipe.AddShader(&vs);
11156 pipe.AddShader(&fs);
11157 pipe.SetMSAA(&pipe_ms_state_ci);
11158 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011159 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011160
11161 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11162 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11163 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11164}
Mark Young29927482016-05-04 14:38:51 -060011165
Mark Muellerd4914412016-06-13 17:52:06 -060011166TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011167 TEST_DESCRIPTION(
11168 "Points to a wrong colorAttachment index in a VkClearAttachment "
11169 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011172
11173 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11174 m_errorMonitor->VerifyFound();
11175}
11176
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011177TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011178 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11179 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011180
Tony Barbour1fa09702017-03-16 12:09:08 -060011181 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011183
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011184 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11186 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011187
11188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11190 ds_pool_ci.pNext = NULL;
11191 ds_pool_ci.maxSets = 1;
11192 ds_pool_ci.poolSizeCount = 1;
11193 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011194
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011195 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011196 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011197 ASSERT_VK_SUCCESS(err);
11198
Tony Barboureb254902015-07-15 12:50:33 -060011199 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011200 dsl_binding.binding = 0;
11201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11202 dsl_binding.descriptorCount = 1;
11203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11204 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011205
Tony Barboureb254902015-07-15 12:50:33 -060011206 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011207 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11208 ds_layout_ci.pNext = NULL;
11209 ds_layout_ci.bindingCount = 1;
11210 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011211
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011212 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011213 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011214 ASSERT_VK_SUCCESS(err);
11215
11216 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011217 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011218 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011219 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011220 alloc_info.descriptorPool = ds_pool;
11221 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011222 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011223 ASSERT_VK_SUCCESS(err);
11224
Tony Barboureb254902015-07-15 12:50:33 -060011225 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011226 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011227 pipe_ms_state_ci.pNext = NULL;
11228 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11229 pipe_ms_state_ci.sampleShadingEnable = 0;
11230 pipe_ms_state_ci.minSampleShading = 1.0;
11231 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011232
Tony Barboureb254902015-07-15 12:50:33 -060011233 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011234 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11235 pipeline_layout_ci.pNext = NULL;
11236 pipeline_layout_ci.setLayoutCount = 1;
11237 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011238
11239 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011240 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011241 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011242
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011243 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011244 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011245 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011246 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011247
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011248 VkPipelineObj pipe(m_device);
11249 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011250 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011251 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011252 pipe.SetMSAA(&pipe_ms_state_ci);
11253 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011254
Tony Barbour552f6c02016-12-21 14:34:07 -070011255 m_commandBuffer->BeginCommandBuffer();
11256 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011257
Karl Schultz6addd812016-02-02 17:17:23 -070011258 // Main thing we care about for this test is that the VkImage obj we're
11259 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011260 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011261 VkClearAttachment color_attachment;
11262 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11263 color_attachment.clearValue.color.float32[0] = 1.0;
11264 color_attachment.clearValue.color.float32[1] = 1.0;
11265 color_attachment.clearValue.color.float32[2] = 1.0;
11266 color_attachment.clearValue.color.float32[3] = 1.0;
11267 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011268 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011269
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011270 // Call for full-sized FB Color attachment prior to issuing a Draw
11271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011272 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011273 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011274 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011275
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011276 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11277 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11279 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11280 m_errorMonitor->VerifyFound();
11281
11282 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11283 clear_rect.layerCount = 2;
11284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11285 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011286 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011287
Chia-I Wuf7458c52015-10-26 21:10:41 +080011288 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11289 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11290 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011291}
11292
Karl Schultz6addd812016-02-02 17:17:23 -070011293TEST_F(VkLayerTest, VtxBufferBadIndex) {
11294 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011295
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11297 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011298
Tony Barbour1fa09702017-03-16 12:09:08 -060011299 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011300 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011302
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011303 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011304 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11305 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011306
11307 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011308 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11309 ds_pool_ci.pNext = NULL;
11310 ds_pool_ci.maxSets = 1;
11311 ds_pool_ci.poolSizeCount = 1;
11312 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011313
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011314 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011315 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011316 ASSERT_VK_SUCCESS(err);
11317
Tony Barboureb254902015-07-15 12:50:33 -060011318 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011319 dsl_binding.binding = 0;
11320 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11321 dsl_binding.descriptorCount = 1;
11322 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11323 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011324
Tony Barboureb254902015-07-15 12:50:33 -060011325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11327 ds_layout_ci.pNext = NULL;
11328 ds_layout_ci.bindingCount = 1;
11329 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011330
Tobin Ehlis502480b2015-06-24 15:53:07 -060011331 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011333 ASSERT_VK_SUCCESS(err);
11334
11335 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011336 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011337 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011338 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011339 alloc_info.descriptorPool = ds_pool;
11340 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011341 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011342 ASSERT_VK_SUCCESS(err);
11343
Tony Barboureb254902015-07-15 12:50:33 -060011344 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011345 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011346 pipe_ms_state_ci.pNext = NULL;
11347 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11348 pipe_ms_state_ci.sampleShadingEnable = 0;
11349 pipe_ms_state_ci.minSampleShading = 1.0;
11350 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011351
Tony Barboureb254902015-07-15 12:50:33 -060011352 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011353 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11354 pipeline_layout_ci.pNext = NULL;
11355 pipeline_layout_ci.setLayoutCount = 1;
11356 pipeline_layout_ci.pSetLayouts = &ds_layout;
11357 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011359 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011360 ASSERT_VK_SUCCESS(err);
11361
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011362 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011363 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 -060011364 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011365 VkPipelineObj pipe(m_device);
11366 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011367 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011368 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011369 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011370 pipe.SetViewport(m_viewports);
11371 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011372 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011373
Tony Barbour552f6c02016-12-21 14:34:07 -070011374 m_commandBuffer->BeginCommandBuffer();
11375 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011376 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011377 // Don't care about actual data, just need to get to draw to flag error
11378 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011379 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011380 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011381 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011382
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011383 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011384
Chia-I Wuf7458c52015-10-26 21:10:41 +080011385 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11386 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11387 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011388}
Mark Muellerdfe37552016-07-07 14:47:42 -060011389
Mark Mueller2ee294f2016-08-04 12:59:48 -060011390TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011391 TEST_DESCRIPTION(
11392 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11393 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011394 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011395
Mark Mueller880fce52016-08-17 15:23:23 -060011396 // The following test fails with recent NVidia drivers.
11397 // By the time core_validation is reached, the NVidia
11398 // driver has sanitized the invalid condition and core_validation
11399 // is not introduced to the failure condition. This is not the case
11400 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011401 // uint32_t count = static_cast<uint32_t>(~0);
11402 // VkPhysicalDevice physical_device;
11403 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11404 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011405
Mark Mueller2ee294f2016-08-04 12:59:48 -060011406 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011407 VkDeviceQueueCreateInfo queue_create_info = {};
11408 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11409 queue_create_info.queueCount = 1;
11410 queue_create_info.pQueuePriorities = &queue_priority;
11411 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11412
11413 VkPhysicalDeviceFeatures features = m_device->phy().features();
11414 VkDevice testDevice;
11415 VkDeviceCreateInfo device_create_info = {};
11416 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11417 device_create_info.queueCreateInfoCount = 1;
11418 device_create_info.pQueueCreateInfos = &queue_create_info;
11419 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011420
11421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11422 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011423 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11424 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11425 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011426 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11427 m_errorMonitor->VerifyFound();
11428
11429 queue_create_info.queueFamilyIndex = 1;
11430
11431 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11432 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11433 for (unsigned i = 0; i < feature_count; i++) {
11434 if (VK_FALSE == feature_array[i]) {
11435 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011436 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11438 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011439 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11440 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11441 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11443 "You requested features that are unavailable on this device. You should first "
11444 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011445 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11446 m_errorMonitor->VerifyFound();
11447 break;
11448 }
11449 }
11450}
11451
Tobin Ehlis16edf082016-11-21 12:33:49 -070011452TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11453 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11454
Tony Barbour1fa09702017-03-16 12:09:08 -060011455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011456
11457 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11458 std::vector<VkDeviceQueueCreateInfo> queue_info;
11459 queue_info.reserve(queue_props.size());
11460 std::vector<std::vector<float>> queue_priorities;
11461 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11462 VkDeviceQueueCreateInfo qi{};
11463 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11464 qi.queueFamilyIndex = i;
11465 qi.queueCount = queue_props[i].queueCount;
11466 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11467 qi.pQueuePriorities = queue_priorities[i].data();
11468 queue_info.push_back(qi);
11469 }
11470
11471 std::vector<const char *> device_extension_names;
11472
11473 VkDevice local_device;
11474 VkDeviceCreateInfo device_create_info = {};
11475 auto features = m_device->phy().features();
11476 // Intentionally disable pipeline stats
11477 features.pipelineStatisticsQuery = VK_FALSE;
11478 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11479 device_create_info.pNext = NULL;
11480 device_create_info.queueCreateInfoCount = queue_info.size();
11481 device_create_info.pQueueCreateInfos = queue_info.data();
11482 device_create_info.enabledLayerCount = 0;
11483 device_create_info.ppEnabledLayerNames = NULL;
11484 device_create_info.pEnabledFeatures = &features;
11485 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11486 ASSERT_VK_SUCCESS(err);
11487
11488 VkQueryPoolCreateInfo qpci{};
11489 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11490 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11491 qpci.queryCount = 1;
11492 VkQueryPool query_pool;
11493
11494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11495 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11496 m_errorMonitor->VerifyFound();
11497
11498 vkDestroyDevice(local_device, nullptr);
11499}
11500
Mark Mueller2ee294f2016-08-04 12:59:48 -060011501TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011502 TEST_DESCRIPTION(
11503 "Use an invalid queue index in a vkCmdWaitEvents call."
11504 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011506 const char *invalid_queue_index =
11507 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11508 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11509 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011510
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011511 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011512
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011514
Tony Barbour1fa09702017-03-16 12:09:08 -060011515 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011516
11517 VkEvent event;
11518 VkEventCreateInfo event_create_info{};
11519 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11520 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11521
Mark Mueller2ee294f2016-08-04 12:59:48 -060011522 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011523 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011524
Tony Barbour552f6c02016-12-21 14:34:07 -070011525 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011526
11527 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011528 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011529 ASSERT_TRUE(image.initialized());
11530 VkImageMemoryBarrier img_barrier = {};
11531 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11532 img_barrier.pNext = NULL;
11533 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11534 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11535 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11536 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11537 img_barrier.image = image.handle();
11538 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011539
11540 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11541 // that layer validation catches the case when it is not.
11542 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011543 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11544 img_barrier.subresourceRange.baseArrayLayer = 0;
11545 img_barrier.subresourceRange.baseMipLevel = 0;
11546 img_barrier.subresourceRange.layerCount = 1;
11547 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011548 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11549 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011550 m_errorMonitor->VerifyFound();
11551
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011553
11554 VkQueryPool query_pool;
11555 VkQueryPoolCreateInfo query_pool_create_info = {};
11556 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11557 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11558 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011560
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011561 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011562 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11563
11564 vkEndCommandBuffer(m_commandBuffer->handle());
11565 m_errorMonitor->VerifyFound();
11566
11567 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11568 vkDestroyEvent(m_device->device(), event, nullptr);
11569}
11570
Mark Muellerdfe37552016-07-07 14:47:42 -060011571TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011572 TEST_DESCRIPTION(
11573 "Submit a command buffer using deleted vertex buffer, "
11574 "delete a buffer twice, use an invalid offset for each "
11575 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011576
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011577 const char *deleted_buffer_in_command_buffer =
11578 "Cannot submit cmd buffer "
11579 "using deleted buffer ";
11580 const char *invalid_offset_message =
11581 "vkBindBufferMemory(): "
11582 "memoryOffset is 0x";
11583 const char *invalid_storage_buffer_offset_message =
11584 "vkBindBufferMemory(): "
11585 "storage memoryOffset "
11586 "is 0x";
11587 const char *invalid_texel_buffer_offset_message =
11588 "vkBindBufferMemory(): "
11589 "texel memoryOffset "
11590 "is 0x";
11591 const char *invalid_uniform_buffer_offset_message =
11592 "vkBindBufferMemory(): "
11593 "uniform memoryOffset "
11594 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011595
Tony Barbour1fa09702017-03-16 12:09:08 -060011596 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011597 ASSERT_NO_FATAL_FAILURE(InitViewport());
11598 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11599
11600 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011602 pipe_ms_state_ci.pNext = NULL;
11603 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11604 pipe_ms_state_ci.sampleShadingEnable = 0;
11605 pipe_ms_state_ci.minSampleShading = 1.0;
11606 pipe_ms_state_ci.pSampleMask = nullptr;
11607
11608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11610 VkPipelineLayout pipeline_layout;
11611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011612 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011613 ASSERT_VK_SUCCESS(err);
11614
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11616 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011617 VkPipelineObj pipe(m_device);
11618 pipe.AddShader(&vs);
11619 pipe.AddShader(&fs);
11620 pipe.AddColorAttachment();
11621 pipe.SetMSAA(&pipe_ms_state_ci);
11622 pipe.SetViewport(m_viewports);
11623 pipe.SetScissor(m_scissors);
11624 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11625
Tony Barbour552f6c02016-12-21 14:34:07 -070011626 m_commandBuffer->BeginCommandBuffer();
11627 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011628 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011629
11630 {
11631 // Create and bind a vertex buffer in a reduced scope, which will cause
11632 // it to be deleted upon leaving this scope
11633 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011634 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011635 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11636 draw_verticies.AddVertexInputToPipe(pipe);
11637 }
11638
11639 Draw(1, 0, 0, 0);
11640
Tony Barbour552f6c02016-12-21 14:34:07 -070011641 m_commandBuffer->EndRenderPass();
11642 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011643
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011645 QueueCommandBuffer(false);
11646 m_errorMonitor->VerifyFound();
11647
11648 {
11649 // Create and bind a vertex buffer in a reduced scope, and delete it
11650 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011651 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011653 buffer_test.TestDoubleDestroy();
11654 }
11655 m_errorMonitor->VerifyFound();
11656
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011657 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011659 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011661 m_errorMonitor->SetUnexpectedError(
11662 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11663 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011664 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11665 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011666 m_errorMonitor->VerifyFound();
11667 }
11668
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011669 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11670 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011671 // Create and bind a memory buffer with an invalid offset again,
11672 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011674 m_errorMonitor->SetUnexpectedError(
11675 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11676 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011677 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11678 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011679 m_errorMonitor->VerifyFound();
11680 }
11681
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011682 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011683 // Create and bind a memory buffer with an invalid offset again, but
11684 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011686 m_errorMonitor->SetUnexpectedError(
11687 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11688 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011689 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11690 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011691 m_errorMonitor->VerifyFound();
11692 }
11693
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011694 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011695 // Create and bind a memory buffer with an invalid offset again, but
11696 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011698 m_errorMonitor->SetUnexpectedError(
11699 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11700 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011701 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11702 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011703 m_errorMonitor->VerifyFound();
11704 }
11705
11706 {
11707 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011709 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11710 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11712 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011713 m_errorMonitor->VerifyFound();
11714 }
11715
11716 {
11717 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011719 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11720 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011721 }
11722 m_errorMonitor->VerifyFound();
11723
11724 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11725}
11726
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011727// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11728TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011729 TEST_DESCRIPTION(
11730 "Hit all possible validation checks associated with the "
11731 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11732 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011733 // 3 in ValidateCmdBufImageLayouts
11734 // * -1 Attempt to submit cmd buf w/ deleted image
11735 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11736 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011737
Tony Barbour1fa09702017-03-16 12:09:08 -060011738 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011739 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011740 if (!depth_format) {
11741 printf(" No Depth + Stencil format found. Skipped.\n");
11742 return;
11743 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011744 // Create src & dst images to use for copy operations
11745 VkImage src_image;
11746 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011747 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011748
11749 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11750 const int32_t tex_width = 32;
11751 const int32_t tex_height = 32;
11752
11753 VkImageCreateInfo image_create_info = {};
11754 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11755 image_create_info.pNext = NULL;
11756 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11757 image_create_info.format = tex_format;
11758 image_create_info.extent.width = tex_width;
11759 image_create_info.extent.height = tex_height;
11760 image_create_info.extent.depth = 1;
11761 image_create_info.mipLevels = 1;
11762 image_create_info.arrayLayers = 4;
11763 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11764 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11765 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011766 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011767 image_create_info.flags = 0;
11768
11769 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11770 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011771 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011772 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11773 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011774 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11775 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11776 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11777 ASSERT_VK_SUCCESS(err);
11778
11779 // Allocate memory
11780 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011781 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011782 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011783 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11784 mem_alloc.pNext = NULL;
11785 mem_alloc.allocationSize = 0;
11786 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011787
11788 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011789 mem_alloc.allocationSize = img_mem_reqs.size;
11790 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011791 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011792 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011793 ASSERT_VK_SUCCESS(err);
11794
11795 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011796 mem_alloc.allocationSize = img_mem_reqs.size;
11797 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011798 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011799 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011800 ASSERT_VK_SUCCESS(err);
11801
11802 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011803 mem_alloc.allocationSize = img_mem_reqs.size;
11804 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011805 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011806 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011807 ASSERT_VK_SUCCESS(err);
11808
11809 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11810 ASSERT_VK_SUCCESS(err);
11811 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11812 ASSERT_VK_SUCCESS(err);
11813 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11814 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011815
Tony Barbour552f6c02016-12-21 14:34:07 -070011816 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011817 VkImageCopy copy_region;
11818 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11819 copy_region.srcSubresource.mipLevel = 0;
11820 copy_region.srcSubresource.baseArrayLayer = 0;
11821 copy_region.srcSubresource.layerCount = 1;
11822 copy_region.srcOffset.x = 0;
11823 copy_region.srcOffset.y = 0;
11824 copy_region.srcOffset.z = 0;
11825 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11826 copy_region.dstSubresource.mipLevel = 0;
11827 copy_region.dstSubresource.baseArrayLayer = 0;
11828 copy_region.dstSubresource.layerCount = 1;
11829 copy_region.dstOffset.x = 0;
11830 copy_region.dstOffset.y = 0;
11831 copy_region.dstOffset.z = 0;
11832 copy_region.extent.width = 1;
11833 copy_region.extent.height = 1;
11834 copy_region.extent.depth = 1;
11835
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11837 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11838 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011839
Cort530cf382016-12-08 09:59:47 -080011840 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 -060011841 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011842 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11843 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011844 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11845 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011846 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 -060011847 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011849 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11850 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011851 m_errorMonitor->SetUnexpectedError(
11852 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011853 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 -060011854 m_errorMonitor->VerifyFound();
11855 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011857 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011858 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011859 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011860 "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 -080011861 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 -060011862 m_errorMonitor->VerifyFound();
11863 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11865 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11866 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011867 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 -060011868 m_errorMonitor->VerifyFound();
11869 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011871 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011872 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011873 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011874 "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 -080011875 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 -060011876 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011878 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11879 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011880 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011881 "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 -080011882 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 -060011883 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011884
Cort3b021012016-12-07 12:00:57 -080011885 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11886 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11887 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11888 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11889 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11890 transfer_dst_image_barrier[0].srcAccessMask = 0;
11891 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11892 transfer_dst_image_barrier[0].image = dst_image;
11893 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11894 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11895 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11896 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11897 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11898 transfer_dst_image_barrier[0].image = depth_image;
11899 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11900 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11901 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11902
11903 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011904 VkClearColorValue color_clear_value = {};
11905 VkImageSubresourceRange clear_range;
11906 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11907 clear_range.baseMipLevel = 0;
11908 clear_range.baseArrayLayer = 0;
11909 clear_range.layerCount = 1;
11910 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011911
Cort3b021012016-12-07 12:00:57 -080011912 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11913 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011916 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011917 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011918 // Fail due to provided layout not matching actual current layout for color clear.
11919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011920 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011921 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011922
Cort530cf382016-12-08 09:59:47 -080011923 VkClearDepthStencilValue depth_clear_value = {};
11924 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011925
11926 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11927 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011930 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011931 m_errorMonitor->VerifyFound();
11932 // Fail due to provided layout not matching actual current layout for depth clear.
11933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011934 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011935 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011936
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 // Now cause error due to bad image layout transition in PipelineBarrier
11938 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011939 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011940 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011941 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011942 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011943 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11944 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011945 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011947 "you cannot transition the layout of aspect 1 from "
11948 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11949 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011951 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11952 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011953 m_errorMonitor->VerifyFound();
11954
11955 // Finally some layout errors at RenderPass create time
11956 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11957 VkAttachmentReference attach = {};
11958 // perf warning for GENERAL layout w/ non-DS input attachment
11959 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11960 VkSubpassDescription subpass = {};
11961 subpass.inputAttachmentCount = 1;
11962 subpass.pInputAttachments = &attach;
11963 VkRenderPassCreateInfo rpci = {};
11964 rpci.subpassCount = 1;
11965 rpci.pSubpasses = &subpass;
11966 rpci.attachmentCount = 1;
11967 VkAttachmentDescription attach_desc = {};
11968 attach_desc.format = VK_FORMAT_UNDEFINED;
11969 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011970 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011971 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11973 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011974 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11975 m_errorMonitor->VerifyFound();
11976 // error w/ non-general layout
11977 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11978
11979 m_errorMonitor->SetDesiredFailureMsg(
11980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11981 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11982 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11983 m_errorMonitor->VerifyFound();
11984 subpass.inputAttachmentCount = 0;
11985 subpass.colorAttachmentCount = 1;
11986 subpass.pColorAttachments = &attach;
11987 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11988 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11990 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011991 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11992 m_errorMonitor->VerifyFound();
11993 // error w/ non-color opt or GENERAL layout for color attachment
11994 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11995 m_errorMonitor->SetDesiredFailureMsg(
11996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11997 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11998 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11999 m_errorMonitor->VerifyFound();
12000 subpass.colorAttachmentCount = 0;
12001 subpass.pDepthStencilAttachment = &attach;
12002 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12003 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12005 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012006 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12007 m_errorMonitor->VerifyFound();
12008 // error w/ non-ds opt or GENERAL layout for color attachment
12009 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12011 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12012 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012013 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12014 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012015 // For this error we need a valid renderpass so create default one
12016 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12017 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012018 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12020 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12021 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12022 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12023 // Can't do a CLEAR load on READ_ONLY initialLayout
12024 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12025 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12026 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012028 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012029 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12030 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012031
Cort3b021012016-12-07 12:00:57 -080012032 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12033 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12034 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012035 vkDestroyImage(m_device->device(), src_image, NULL);
12036 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012037 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012038}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012039
Tobin Ehlise0936662016-10-11 08:10:51 -060012040TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12041 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12042 VkResult err;
12043
Tony Barbour1fa09702017-03-16 12:09:08 -060012044 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012045
12046 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12047 VkImageTiling tiling;
12048 VkFormatProperties format_properties;
12049 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12050 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12051 tiling = VK_IMAGE_TILING_LINEAR;
12052 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12053 tiling = VK_IMAGE_TILING_OPTIMAL;
12054 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012055 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012056 return;
12057 }
12058
12059 VkDescriptorPoolSize ds_type = {};
12060 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12061 ds_type.descriptorCount = 1;
12062
12063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12065 ds_pool_ci.maxSets = 1;
12066 ds_pool_ci.poolSizeCount = 1;
12067 ds_pool_ci.pPoolSizes = &ds_type;
12068 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12069
12070 VkDescriptorPool ds_pool;
12071 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12072 ASSERT_VK_SUCCESS(err);
12073
12074 VkDescriptorSetLayoutBinding dsl_binding = {};
12075 dsl_binding.binding = 0;
12076 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12077 dsl_binding.descriptorCount = 1;
12078 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12079 dsl_binding.pImmutableSamplers = NULL;
12080
12081 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12082 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12083 ds_layout_ci.pNext = NULL;
12084 ds_layout_ci.bindingCount = 1;
12085 ds_layout_ci.pBindings = &dsl_binding;
12086
12087 VkDescriptorSetLayout ds_layout;
12088 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12089 ASSERT_VK_SUCCESS(err);
12090
12091 VkDescriptorSetAllocateInfo alloc_info = {};
12092 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12093 alloc_info.descriptorSetCount = 1;
12094 alloc_info.descriptorPool = ds_pool;
12095 alloc_info.pSetLayouts = &ds_layout;
12096 VkDescriptorSet descriptor_set;
12097 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12098 ASSERT_VK_SUCCESS(err);
12099
12100 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12101 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12102 pipeline_layout_ci.pNext = NULL;
12103 pipeline_layout_ci.setLayoutCount = 1;
12104 pipeline_layout_ci.pSetLayouts = &ds_layout;
12105 VkPipelineLayout pipeline_layout;
12106 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12107 ASSERT_VK_SUCCESS(err);
12108
12109 VkImageObj image(m_device);
12110 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12111 ASSERT_TRUE(image.initialized());
12112 VkImageView view = image.targetView(tex_format);
12113
12114 VkDescriptorImageInfo image_info = {};
12115 image_info.imageView = view;
12116 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12117
12118 VkWriteDescriptorSet descriptor_write = {};
12119 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12120 descriptor_write.dstSet = descriptor_set;
12121 descriptor_write.dstBinding = 0;
12122 descriptor_write.descriptorCount = 1;
12123 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12124 descriptor_write.pImageInfo = &image_info;
12125
12126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12127 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12128 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12129 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12130 m_errorMonitor->VerifyFound();
12131
12132 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12133 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12134 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12135 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12136}
12137
Mark Mueller93b938f2016-08-18 10:27:40 -060012138TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012139 TEST_DESCRIPTION(
12140 "Use vkCmdExecuteCommands with invalid state "
12141 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012142
Tony Barbour1fa09702017-03-16 12:09:08 -060012143 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12145
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012146 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012147 const char *simultaneous_use_message2 =
12148 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12149 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012150
12151 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012152 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012153 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012154 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12155 command_buffer_allocate_info.commandBufferCount = 1;
12156
12157 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012158 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012159 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12160 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012161 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012162 command_buffer_inheritance_info.renderPass = m_renderPass;
12163 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012164
Mark Mueller93b938f2016-08-18 10:27:40 -060012165 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012166 command_buffer_begin_info.flags =
12167 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012168 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12169
12170 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12171 vkEndCommandBuffer(secondary_command_buffer);
12172
Mark Mueller93b938f2016-08-18 10:27:40 -060012173 VkSubmitInfo submit_info = {};
12174 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12175 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012176 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012177
Mark Mueller4042b652016-09-05 22:52:21 -060012178 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012179 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12181 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012182 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012183 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012184 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12185 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012186
Dave Houltonfbf52152017-01-06 12:55:29 -070012187 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012188 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012189 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012190
Mark Mueller4042b652016-09-05 22:52:21 -060012191 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012192 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12193 m_errorMonitor->SetUnexpectedError(
12194 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12195 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012196 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012197 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012198
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12200 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012201 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012202 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12203 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012204
12205 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012206
12207 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012208}
12209
Tony Barbour626994c2017-02-08 15:29:37 -070012210TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12211 TEST_DESCRIPTION(
12212 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12213 "errors");
12214 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12215 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 -060012216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012217
12218 VkCommandBuffer cmd_bufs[2];
12219 VkCommandBufferAllocateInfo alloc_info;
12220 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12221 alloc_info.pNext = NULL;
12222 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012223 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012224 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12225 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12226
12227 VkCommandBufferBeginInfo cb_binfo;
12228 cb_binfo.pNext = NULL;
12229 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12230 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12231 cb_binfo.flags = 0;
12232 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12233 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12234 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12235 vkEndCommandBuffer(cmd_bufs[0]);
12236 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12237
12238 VkSubmitInfo submit_info = {};
12239 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12240 submit_info.commandBufferCount = 2;
12241 submit_info.pCommandBuffers = duplicates;
12242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12243 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12244 m_errorMonitor->VerifyFound();
12245 vkQueueWaitIdle(m_device->m_queue);
12246
12247 // Set one time use and now look for one time submit
12248 duplicates[0] = duplicates[1] = cmd_bufs[1];
12249 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12250 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12251 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12252 vkEndCommandBuffer(cmd_bufs[1]);
12253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12254 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12255 m_errorMonitor->VerifyFound();
12256 vkQueueWaitIdle(m_device->m_queue);
12257}
12258
Tobin Ehlisb093da82017-01-19 12:05:27 -070012259TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012260 TEST_DESCRIPTION(
12261 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12262 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012263
Tony Barbour1fa09702017-03-16 12:09:08 -060012264 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12266
12267 std::vector<const char *> device_extension_names;
12268 auto features = m_device->phy().features();
12269 // Make sure gs & ts are disabled
12270 features.geometryShader = false;
12271 features.tessellationShader = false;
12272 // The sacrificial device object
12273 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12274
12275 VkCommandPoolCreateInfo pool_create_info{};
12276 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12277 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12278
12279 VkCommandPool command_pool;
12280 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12281
12282 VkCommandBufferAllocateInfo cmd = {};
12283 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12284 cmd.pNext = NULL;
12285 cmd.commandPool = command_pool;
12286 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12287 cmd.commandBufferCount = 1;
12288
12289 VkCommandBuffer cmd_buffer;
12290 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12291 ASSERT_VK_SUCCESS(err);
12292
12293 VkEvent event;
12294 VkEventCreateInfo evci = {};
12295 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12296 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12297 ASSERT_VK_SUCCESS(result);
12298
12299 VkCommandBufferBeginInfo cbbi = {};
12300 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12301 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12303 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12304 m_errorMonitor->VerifyFound();
12305
12306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12307 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12308 m_errorMonitor->VerifyFound();
12309
12310 vkDestroyEvent(test_device.handle(), event, NULL);
12311 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12312}
12313
Mark Mueller917f6bc2016-08-30 10:57:19 -060012314TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012315 TEST_DESCRIPTION(
12316 "Use vkCmdExecuteCommands with invalid state "
12317 "in primary and secondary command buffers. "
12318 "Delete objects that are inuse. Call VkQueueSubmit "
12319 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012320
Tony Barbour1fa09702017-03-16 12:09:08 -060012321 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012322 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12323
Tony Barbour552f6c02016-12-21 14:34:07 -070012324 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012325
12326 VkEvent event;
12327 VkEventCreateInfo event_create_info = {};
12328 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12329 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012330 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012331
Tony Barbour552f6c02016-12-21 14:34:07 -070012332 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012333 vkDestroyEvent(m_device->device(), event, nullptr);
12334
12335 VkSubmitInfo submit_info = {};
12336 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12337 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012338 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012340 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12341 m_errorMonitor->VerifyFound();
12342
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012343 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012344 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12345
12346 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12347
Mark Mueller917f6bc2016-08-30 10:57:19 -060012348 VkSemaphoreCreateInfo semaphore_create_info = {};
12349 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12350 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012352 VkFenceCreateInfo fence_create_info = {};
12353 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12354 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012355 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012356
12357 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012358 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012359 descriptor_pool_type_count.descriptorCount = 1;
12360
12361 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12362 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12363 descriptor_pool_create_info.maxSets = 1;
12364 descriptor_pool_create_info.poolSizeCount = 1;
12365 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012367
12368 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012369 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012370
12371 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012372 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012373 descriptorset_layout_binding.descriptorCount = 1;
12374 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12375
12376 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012377 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012378 descriptorset_layout_create_info.bindingCount = 1;
12379 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12380
12381 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012382 ASSERT_VK_SUCCESS(
12383 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012384
12385 VkDescriptorSet descriptorset;
12386 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012387 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012388 descriptorset_allocate_info.descriptorSetCount = 1;
12389 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12390 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012391 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012392
Mark Mueller4042b652016-09-05 22:52:21 -060012393 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12394
12395 VkDescriptorBufferInfo buffer_info = {};
12396 buffer_info.buffer = buffer_test.GetBuffer();
12397 buffer_info.offset = 0;
12398 buffer_info.range = 1024;
12399
12400 VkWriteDescriptorSet write_descriptor_set = {};
12401 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12402 write_descriptor_set.dstSet = descriptorset;
12403 write_descriptor_set.descriptorCount = 1;
12404 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12405 write_descriptor_set.pBufferInfo = &buffer_info;
12406
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012407 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012409 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12410 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012411
12412 VkPipelineObj pipe(m_device);
12413 pipe.AddColorAttachment();
12414 pipe.AddShader(&vs);
12415 pipe.AddShader(&fs);
12416
12417 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012418 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012419 pipeline_layout_create_info.setLayoutCount = 1;
12420 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12421
12422 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012423 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012424
12425 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12426
Tony Barbour552f6c02016-12-21 14:34:07 -070012427 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012428 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012429
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012430 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12431 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12432 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012433
Tony Barbour552f6c02016-12-21 14:34:07 -070012434 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012435
Mark Mueller917f6bc2016-08-30 10:57:19 -060012436 submit_info.signalSemaphoreCount = 1;
12437 submit_info.pSignalSemaphores = &semaphore;
12438 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012439 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012440
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012442 vkDestroyEvent(m_device->device(), event, nullptr);
12443 m_errorMonitor->VerifyFound();
12444
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12447 m_errorMonitor->VerifyFound();
12448
Jeremy Hayes08369882017-02-02 10:31:06 -070012449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012450 vkDestroyFence(m_device->device(), fence, nullptr);
12451 m_errorMonitor->VerifyFound();
12452
Tobin Ehlis122207b2016-09-01 08:50:06 -070012453 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012454 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12455 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012456 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012457 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12458 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012459 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012460 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12461 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012462 vkDestroyEvent(m_device->device(), event, nullptr);
12463 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012464 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012465 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12466}
12467
Tobin Ehlis2adda372016-09-01 08:51:06 -070012468TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12469 TEST_DESCRIPTION("Delete in-use query pool.");
12470
Tony Barbour1fa09702017-03-16 12:09:08 -060012471 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12473
12474 VkQueryPool query_pool;
12475 VkQueryPoolCreateInfo query_pool_ci{};
12476 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12477 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12478 query_pool_ci.queryCount = 1;
12479 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012480 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012481 // Reset query pool to create binding with cmd buffer
12482 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12483
Tony Barbour552f6c02016-12-21 14:34:07 -070012484 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012485
12486 VkSubmitInfo submit_info = {};
12487 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12488 submit_info.commandBufferCount = 1;
12489 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12490 // Submit cmd buffer and then destroy query pool while in-flight
12491 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12492
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012494 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12495 m_errorMonitor->VerifyFound();
12496
12497 vkQueueWaitIdle(m_device->m_queue);
12498 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012499 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12500 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012501 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12502}
12503
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012504TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12505 TEST_DESCRIPTION("Delete in-use pipeline.");
12506
Tony Barbour1fa09702017-03-16 12:09:08 -060012507 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12509
12510 // Empty pipeline layout used for binding PSO
12511 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12512 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12513 pipeline_layout_ci.setLayoutCount = 0;
12514 pipeline_layout_ci.pSetLayouts = NULL;
12515
12516 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012517 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518 ASSERT_VK_SUCCESS(err);
12519
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012522 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12523 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012524 // Store pipeline handle so we can actually delete it before test finishes
12525 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012526 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012527 VkPipelineObj pipe(m_device);
12528 pipe.AddShader(&vs);
12529 pipe.AddShader(&fs);
12530 pipe.AddColorAttachment();
12531 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12532 delete_this_pipeline = pipe.handle();
12533
Tony Barbour552f6c02016-12-21 14:34:07 -070012534 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012535 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012536 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012537
Tony Barbour552f6c02016-12-21 14:34:07 -070012538 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012539
12540 VkSubmitInfo submit_info = {};
12541 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12542 submit_info.commandBufferCount = 1;
12543 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12544 // Submit cmd buffer and then pipeline destroyed while in-flight
12545 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012546 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012547 m_errorMonitor->VerifyFound();
12548 // Make sure queue finished and then actually delete pipeline
12549 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012550 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12551 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012552 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12553 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12554}
12555
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012556TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12557 TEST_DESCRIPTION("Delete in-use imageView.");
12558
Tony Barbour1fa09702017-03-16 12:09:08 -060012559 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12561
12562 VkDescriptorPoolSize ds_type_count;
12563 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12564 ds_type_count.descriptorCount = 1;
12565
12566 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12567 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12568 ds_pool_ci.maxSets = 1;
12569 ds_pool_ci.poolSizeCount = 1;
12570 ds_pool_ci.pPoolSizes = &ds_type_count;
12571
12572 VkDescriptorPool ds_pool;
12573 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12574 ASSERT_VK_SUCCESS(err);
12575
12576 VkSamplerCreateInfo sampler_ci = {};
12577 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12578 sampler_ci.pNext = NULL;
12579 sampler_ci.magFilter = VK_FILTER_NEAREST;
12580 sampler_ci.minFilter = VK_FILTER_NEAREST;
12581 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12582 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12583 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12584 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12585 sampler_ci.mipLodBias = 1.0;
12586 sampler_ci.anisotropyEnable = VK_FALSE;
12587 sampler_ci.maxAnisotropy = 1;
12588 sampler_ci.compareEnable = VK_FALSE;
12589 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12590 sampler_ci.minLod = 1.0;
12591 sampler_ci.maxLod = 1.0;
12592 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12593 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12594 VkSampler sampler;
12595
12596 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12597 ASSERT_VK_SUCCESS(err);
12598
12599 VkDescriptorSetLayoutBinding layout_binding;
12600 layout_binding.binding = 0;
12601 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12602 layout_binding.descriptorCount = 1;
12603 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12604 layout_binding.pImmutableSamplers = NULL;
12605
12606 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12607 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12608 ds_layout_ci.bindingCount = 1;
12609 ds_layout_ci.pBindings = &layout_binding;
12610 VkDescriptorSetLayout ds_layout;
12611 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12612 ASSERT_VK_SUCCESS(err);
12613
12614 VkDescriptorSetAllocateInfo alloc_info = {};
12615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12616 alloc_info.descriptorSetCount = 1;
12617 alloc_info.descriptorPool = ds_pool;
12618 alloc_info.pSetLayouts = &ds_layout;
12619 VkDescriptorSet descriptor_set;
12620 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12621 ASSERT_VK_SUCCESS(err);
12622
12623 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12624 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12625 pipeline_layout_ci.pNext = NULL;
12626 pipeline_layout_ci.setLayoutCount = 1;
12627 pipeline_layout_ci.pSetLayouts = &ds_layout;
12628
12629 VkPipelineLayout pipeline_layout;
12630 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12631 ASSERT_VK_SUCCESS(err);
12632
12633 VkImageObj image(m_device);
12634 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12635 ASSERT_TRUE(image.initialized());
12636
12637 VkImageView view;
12638 VkImageViewCreateInfo ivci = {};
12639 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12640 ivci.image = image.handle();
12641 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12642 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12643 ivci.subresourceRange.layerCount = 1;
12644 ivci.subresourceRange.baseMipLevel = 0;
12645 ivci.subresourceRange.levelCount = 1;
12646 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12647
12648 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12649 ASSERT_VK_SUCCESS(err);
12650
12651 VkDescriptorImageInfo image_info{};
12652 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12653 image_info.imageView = view;
12654 image_info.sampler = sampler;
12655
12656 VkWriteDescriptorSet descriptor_write = {};
12657 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12658 descriptor_write.dstSet = descriptor_set;
12659 descriptor_write.dstBinding = 0;
12660 descriptor_write.descriptorCount = 1;
12661 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12662 descriptor_write.pImageInfo = &image_info;
12663
12664 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12665
12666 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012667 char const *vsSource =
12668 "#version 450\n"
12669 "\n"
12670 "out gl_PerVertex { \n"
12671 " vec4 gl_Position;\n"
12672 "};\n"
12673 "void main(){\n"
12674 " gl_Position = vec4(1);\n"
12675 "}\n";
12676 char const *fsSource =
12677 "#version 450\n"
12678 "\n"
12679 "layout(set=0, binding=0) uniform sampler2D s;\n"
12680 "layout(location=0) out vec4 x;\n"
12681 "void main(){\n"
12682 " x = texture(s, vec2(1));\n"
12683 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12686 VkPipelineObj pipe(m_device);
12687 pipe.AddShader(&vs);
12688 pipe.AddShader(&fs);
12689 pipe.AddColorAttachment();
12690 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12691
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012693
Tony Barbour552f6c02016-12-21 14:34:07 -070012694 m_commandBuffer->BeginCommandBuffer();
12695 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012696 // Bind pipeline to cmd buffer
12697 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12698 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12699 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012700
12701 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12702 VkRect2D scissor = {{0, 0}, {16, 16}};
12703 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12704 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12705
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012706 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012707 m_commandBuffer->EndRenderPass();
12708 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012709 // Submit cmd buffer then destroy sampler
12710 VkSubmitInfo submit_info = {};
12711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12712 submit_info.commandBufferCount = 1;
12713 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12714 // Submit cmd buffer and then destroy imageView while in-flight
12715 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12716
12717 vkDestroyImageView(m_device->device(), view, nullptr);
12718 m_errorMonitor->VerifyFound();
12719 vkQueueWaitIdle(m_device->m_queue);
12720 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012721 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12722 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012723 vkDestroyImageView(m_device->device(), view, NULL);
12724 vkDestroySampler(m_device->device(), sampler, nullptr);
12725 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12726 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12727 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12728}
12729
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012730TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12731 TEST_DESCRIPTION("Delete in-use bufferView.");
12732
Tony Barbour1fa09702017-03-16 12:09:08 -060012733 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12735
12736 VkDescriptorPoolSize ds_type_count;
12737 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12738 ds_type_count.descriptorCount = 1;
12739
12740 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12741 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12742 ds_pool_ci.maxSets = 1;
12743 ds_pool_ci.poolSizeCount = 1;
12744 ds_pool_ci.pPoolSizes = &ds_type_count;
12745
12746 VkDescriptorPool ds_pool;
12747 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12748 ASSERT_VK_SUCCESS(err);
12749
12750 VkDescriptorSetLayoutBinding layout_binding;
12751 layout_binding.binding = 0;
12752 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12753 layout_binding.descriptorCount = 1;
12754 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12755 layout_binding.pImmutableSamplers = NULL;
12756
12757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12759 ds_layout_ci.bindingCount = 1;
12760 ds_layout_ci.pBindings = &layout_binding;
12761 VkDescriptorSetLayout ds_layout;
12762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12763 ASSERT_VK_SUCCESS(err);
12764
12765 VkDescriptorSetAllocateInfo alloc_info = {};
12766 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12767 alloc_info.descriptorSetCount = 1;
12768 alloc_info.descriptorPool = ds_pool;
12769 alloc_info.pSetLayouts = &ds_layout;
12770 VkDescriptorSet descriptor_set;
12771 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12772 ASSERT_VK_SUCCESS(err);
12773
12774 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12775 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12776 pipeline_layout_ci.pNext = NULL;
12777 pipeline_layout_ci.setLayoutCount = 1;
12778 pipeline_layout_ci.pSetLayouts = &ds_layout;
12779
12780 VkPipelineLayout pipeline_layout;
12781 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12782 ASSERT_VK_SUCCESS(err);
12783
12784 VkBuffer buffer;
12785 uint32_t queue_family_index = 0;
12786 VkBufferCreateInfo buffer_create_info = {};
12787 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12788 buffer_create_info.size = 1024;
12789 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12790 buffer_create_info.queueFamilyIndexCount = 1;
12791 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12792
12793 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12794 ASSERT_VK_SUCCESS(err);
12795
12796 VkMemoryRequirements memory_reqs;
12797 VkDeviceMemory buffer_memory;
12798
12799 VkMemoryAllocateInfo memory_info = {};
12800 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12801 memory_info.allocationSize = 0;
12802 memory_info.memoryTypeIndex = 0;
12803
12804 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12805 memory_info.allocationSize = memory_reqs.size;
12806 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12807 ASSERT_TRUE(pass);
12808
12809 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12810 ASSERT_VK_SUCCESS(err);
12811 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12812 ASSERT_VK_SUCCESS(err);
12813
12814 VkBufferView view;
12815 VkBufferViewCreateInfo bvci = {};
12816 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12817 bvci.buffer = buffer;
12818 bvci.format = VK_FORMAT_R8_UNORM;
12819 bvci.range = VK_WHOLE_SIZE;
12820
12821 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12822 ASSERT_VK_SUCCESS(err);
12823
12824 VkWriteDescriptorSet descriptor_write = {};
12825 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12826 descriptor_write.dstSet = descriptor_set;
12827 descriptor_write.dstBinding = 0;
12828 descriptor_write.descriptorCount = 1;
12829 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12830 descriptor_write.pTexelBufferView = &view;
12831
12832 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12833
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012834 char const *vsSource =
12835 "#version 450\n"
12836 "\n"
12837 "out gl_PerVertex { \n"
12838 " vec4 gl_Position;\n"
12839 "};\n"
12840 "void main(){\n"
12841 " gl_Position = vec4(1);\n"
12842 "}\n";
12843 char const *fsSource =
12844 "#version 450\n"
12845 "\n"
12846 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12847 "layout(location=0) out vec4 x;\n"
12848 "void main(){\n"
12849 " x = imageLoad(s, 0);\n"
12850 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012851 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12852 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12853 VkPipelineObj pipe(m_device);
12854 pipe.AddShader(&vs);
12855 pipe.AddShader(&fs);
12856 pipe.AddColorAttachment();
12857 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12858
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012860
Tony Barbour552f6c02016-12-21 14:34:07 -070012861 m_commandBuffer->BeginCommandBuffer();
12862 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012863 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12864 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12865 VkRect2D scissor = {{0, 0}, {16, 16}};
12866 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12867 // Bind pipeline to cmd buffer
12868 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12869 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12870 &descriptor_set, 0, nullptr);
12871 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012872 m_commandBuffer->EndRenderPass();
12873 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012874
12875 VkSubmitInfo submit_info = {};
12876 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12877 submit_info.commandBufferCount = 1;
12878 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12879 // Submit cmd buffer and then destroy bufferView while in-flight
12880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12881
12882 vkDestroyBufferView(m_device->device(), view, nullptr);
12883 m_errorMonitor->VerifyFound();
12884 vkQueueWaitIdle(m_device->m_queue);
12885 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012886 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12887 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012888 vkDestroyBufferView(m_device->device(), view, NULL);
12889 vkDestroyBuffer(m_device->device(), buffer, NULL);
12890 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12891 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12892 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12893 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12894}
12895
Tobin Ehlis209532e2016-09-07 13:52:18 -060012896TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12897 TEST_DESCRIPTION("Delete in-use sampler.");
12898
Tony Barbour1fa09702017-03-16 12:09:08 -060012899 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12901
12902 VkDescriptorPoolSize ds_type_count;
12903 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12904 ds_type_count.descriptorCount = 1;
12905
12906 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12907 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12908 ds_pool_ci.maxSets = 1;
12909 ds_pool_ci.poolSizeCount = 1;
12910 ds_pool_ci.pPoolSizes = &ds_type_count;
12911
12912 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012913 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012914 ASSERT_VK_SUCCESS(err);
12915
12916 VkSamplerCreateInfo sampler_ci = {};
12917 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12918 sampler_ci.pNext = NULL;
12919 sampler_ci.magFilter = VK_FILTER_NEAREST;
12920 sampler_ci.minFilter = VK_FILTER_NEAREST;
12921 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12922 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12923 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12924 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12925 sampler_ci.mipLodBias = 1.0;
12926 sampler_ci.anisotropyEnable = VK_FALSE;
12927 sampler_ci.maxAnisotropy = 1;
12928 sampler_ci.compareEnable = VK_FALSE;
12929 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12930 sampler_ci.minLod = 1.0;
12931 sampler_ci.maxLod = 1.0;
12932 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12933 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12934 VkSampler sampler;
12935
12936 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12937 ASSERT_VK_SUCCESS(err);
12938
12939 VkDescriptorSetLayoutBinding layout_binding;
12940 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012941 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012942 layout_binding.descriptorCount = 1;
12943 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12944 layout_binding.pImmutableSamplers = NULL;
12945
12946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12948 ds_layout_ci.bindingCount = 1;
12949 ds_layout_ci.pBindings = &layout_binding;
12950 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012952 ASSERT_VK_SUCCESS(err);
12953
12954 VkDescriptorSetAllocateInfo alloc_info = {};
12955 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12956 alloc_info.descriptorSetCount = 1;
12957 alloc_info.descriptorPool = ds_pool;
12958 alloc_info.pSetLayouts = &ds_layout;
12959 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012960 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012961 ASSERT_VK_SUCCESS(err);
12962
12963 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12964 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12965 pipeline_layout_ci.pNext = NULL;
12966 pipeline_layout_ci.setLayoutCount = 1;
12967 pipeline_layout_ci.pSetLayouts = &ds_layout;
12968
12969 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012970 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012971 ASSERT_VK_SUCCESS(err);
12972
12973 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012974 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012975 ASSERT_TRUE(image.initialized());
12976
12977 VkImageView view;
12978 VkImageViewCreateInfo ivci = {};
12979 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12980 ivci.image = image.handle();
12981 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12982 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12983 ivci.subresourceRange.layerCount = 1;
12984 ivci.subresourceRange.baseMipLevel = 0;
12985 ivci.subresourceRange.levelCount = 1;
12986 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12987
12988 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12989 ASSERT_VK_SUCCESS(err);
12990
12991 VkDescriptorImageInfo image_info{};
12992 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12993 image_info.imageView = view;
12994 image_info.sampler = sampler;
12995
12996 VkWriteDescriptorSet descriptor_write = {};
12997 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12998 descriptor_write.dstSet = descriptor_set;
12999 descriptor_write.dstBinding = 0;
13000 descriptor_write.descriptorCount = 1;
13001 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13002 descriptor_write.pImageInfo = &image_info;
13003
13004 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13005
13006 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013007 char const *vsSource =
13008 "#version 450\n"
13009 "\n"
13010 "out gl_PerVertex { \n"
13011 " vec4 gl_Position;\n"
13012 "};\n"
13013 "void main(){\n"
13014 " gl_Position = vec4(1);\n"
13015 "}\n";
13016 char const *fsSource =
13017 "#version 450\n"
13018 "\n"
13019 "layout(set=0, binding=0) uniform sampler2D s;\n"
13020 "layout(location=0) out vec4 x;\n"
13021 "void main(){\n"
13022 " x = texture(s, vec2(1));\n"
13023 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13026 VkPipelineObj pipe(m_device);
13027 pipe.AddShader(&vs);
13028 pipe.AddShader(&fs);
13029 pipe.AddColorAttachment();
13030 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13031
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013033
Tony Barbour552f6c02016-12-21 14:34:07 -070013034 m_commandBuffer->BeginCommandBuffer();
13035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013036 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013037 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13038 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13039 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013040
13041 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13042 VkRect2D scissor = {{0, 0}, {16, 16}};
13043 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13044 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13045
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013047 m_commandBuffer->EndRenderPass();
13048 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013049 // Submit cmd buffer then destroy sampler
13050 VkSubmitInfo submit_info = {};
13051 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13052 submit_info.commandBufferCount = 1;
13053 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13054 // Submit cmd buffer and then destroy sampler while in-flight
13055 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13056
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013057 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013058 m_errorMonitor->VerifyFound();
13059 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013060
Tobin Ehlis209532e2016-09-07 13:52:18 -060013061 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013062 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13063 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013064 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013065 vkDestroyImageView(m_device->device(), view, NULL);
13066 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13067 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13068 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13069}
13070
Mark Mueller1cd9f412016-08-25 13:23:52 -060013071TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013072 TEST_DESCRIPTION(
13073 "Call VkQueueSubmit with a semaphore that is already "
13074 "signaled but not waited on by the queue. Wait on a "
13075 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013076
Tony Barbour1fa09702017-03-16 12:09:08 -060013077 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13079
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013080 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 -070013081 const char *invalid_fence_wait_message =
13082 " which has not been submitted on a Queue or during "
13083 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013084
Tony Barbour552f6c02016-12-21 14:34:07 -070013085 m_commandBuffer->BeginCommandBuffer();
13086 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013087
13088 VkSemaphoreCreateInfo semaphore_create_info = {};
13089 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13090 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013091 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013092 VkSubmitInfo submit_info = {};
13093 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13094 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013095 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013096 submit_info.signalSemaphoreCount = 1;
13097 submit_info.pSignalSemaphores = &semaphore;
13098 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013099 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013100 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013101 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013102 m_commandBuffer->BeginCommandBuffer();
13103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013105 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13106 m_errorMonitor->VerifyFound();
13107
Mark Mueller1cd9f412016-08-25 13:23:52 -060013108 VkFenceCreateInfo fence_create_info = {};
13109 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13110 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013111 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013112
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013114 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13115 m_errorMonitor->VerifyFound();
13116
Mark Mueller4042b652016-09-05 22:52:21 -060013117 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013118 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013119 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13120}
13121
Tobin Ehlis4af23302016-07-19 10:50:30 -060013122TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013123 TEST_DESCRIPTION(
13124 "Bind a secondary command buffer with with a framebuffer "
13125 "that does not match the framebuffer for the active "
13126 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013127 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13129
13130 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013131 VkAttachmentDescription attachment = {0,
13132 VK_FORMAT_B8G8R8A8_UNORM,
13133 VK_SAMPLE_COUNT_1_BIT,
13134 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13135 VK_ATTACHMENT_STORE_OP_STORE,
13136 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13137 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13138 VK_IMAGE_LAYOUT_UNDEFINED,
13139 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013140
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013141 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013143 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013145 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013146
13147 VkRenderPass rp;
13148 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13149 ASSERT_VK_SUCCESS(err);
13150
13151 // A compatible framebuffer.
13152 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013153 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013154 ASSERT_TRUE(image.initialized());
13155
13156 VkImageViewCreateInfo ivci = {
13157 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13158 nullptr,
13159 0,
13160 image.handle(),
13161 VK_IMAGE_VIEW_TYPE_2D,
13162 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013163 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13164 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013165 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13166 };
13167 VkImageView view;
13168 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13169 ASSERT_VK_SUCCESS(err);
13170
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013171 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013172 VkFramebuffer fb;
13173 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13174 ASSERT_VK_SUCCESS(err);
13175
13176 VkCommandBufferAllocateInfo cbai = {};
13177 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013178 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013179 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13180 cbai.commandBufferCount = 1;
13181
13182 VkCommandBuffer sec_cb;
13183 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13184 ASSERT_VK_SUCCESS(err);
13185 VkCommandBufferBeginInfo cbbi = {};
13186 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013187 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013188 cbii.renderPass = renderPass();
13189 cbii.framebuffer = fb;
13190 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13191 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013192 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 -060013193 cbbi.pInheritanceInfo = &cbii;
13194 vkBeginCommandBuffer(sec_cb, &cbbi);
13195 vkEndCommandBuffer(sec_cb);
13196
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013197 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013198 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13199 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013202 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013203 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13204 m_errorMonitor->VerifyFound();
13205 // Cleanup
13206 vkDestroyImageView(m_device->device(), view, NULL);
13207 vkDestroyRenderPass(m_device->device(), rp, NULL);
13208 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13209}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013210
13211TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013212 TEST_DESCRIPTION(
13213 "If logicOp is available on the device, set it to an "
13214 "invalid value. If logicOp is not available, attempt to "
13215 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013216 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013217 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13218
13219 auto features = m_device->phy().features();
13220 // Set the expected error depending on whether or not logicOp available
13221 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13223 "If logic operations feature not "
13224 "enabled, logicOpEnable must be "
13225 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013226 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013228 }
13229 // Create a pipeline using logicOp
13230 VkResult err;
13231
13232 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13233 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13234
13235 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013236 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013237 ASSERT_VK_SUCCESS(err);
13238
13239 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13240 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13241 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013242 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013243 vp_state_ci.pViewports = &vp;
13244 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013245 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013246 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013247
13248 VkPipelineShaderStageCreateInfo shaderStages[2];
13249 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13250
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013251 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13252 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013253 shaderStages[0] = vs.GetStageCreateInfo();
13254 shaderStages[1] = fs.GetStageCreateInfo();
13255
13256 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13257 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13258
13259 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13260 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13261 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13262
13263 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13264 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013265 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013266
13267 VkPipelineColorBlendAttachmentState att = {};
13268 att.blendEnable = VK_FALSE;
13269 att.colorWriteMask = 0xf;
13270
13271 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13272 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13273 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13274 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013275 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013276 cb_ci.attachmentCount = 1;
13277 cb_ci.pAttachments = &att;
13278
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013279 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13280 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13281 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13282
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013283 VkGraphicsPipelineCreateInfo gp_ci = {};
13284 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13285 gp_ci.stageCount = 2;
13286 gp_ci.pStages = shaderStages;
13287 gp_ci.pVertexInputState = &vi_ci;
13288 gp_ci.pInputAssemblyState = &ia_ci;
13289 gp_ci.pViewportState = &vp_state_ci;
13290 gp_ci.pRasterizationState = &rs_ci;
13291 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013292 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013293 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13294 gp_ci.layout = pipeline_layout;
13295 gp_ci.renderPass = renderPass();
13296
13297 VkPipelineCacheCreateInfo pc_ci = {};
13298 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13299
13300 VkPipeline pipeline;
13301 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013302 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013303 ASSERT_VK_SUCCESS(err);
13304
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013305 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013306 m_errorMonitor->VerifyFound();
13307 if (VK_SUCCESS == err) {
13308 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13309 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013310 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13311 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13312}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013313
Mike Stroyanaccf7692015-05-12 16:00:45 -060013314#if GTEST_IS_THREADSAFE
13315struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013316 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013317 VkEvent event;
13318 bool bailout;
13319};
13320
Karl Schultz6addd812016-02-02 17:17:23 -070013321extern "C" void *AddToCommandBuffer(void *arg) {
13322 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013323
Mike Stroyana6d14942016-07-13 15:10:05 -060013324 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013325 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013326 if (data->bailout) {
13327 break;
13328 }
13329 }
13330 return NULL;
13331}
13332
Karl Schultz6addd812016-02-02 17:17:23 -070013333TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013334 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013337
Tony Barbour1fa09702017-03-16 12:09:08 -060013338 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013339 ASSERT_NO_FATAL_FAILURE(InitViewport());
13340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13341
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013342 // Calls AllocateCommandBuffers
13343 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013344
13345 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013346 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013347
13348 VkEventCreateInfo event_info;
13349 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013350 VkResult err;
13351
13352 memset(&event_info, 0, sizeof(event_info));
13353 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13354
Chia-I Wuf7458c52015-10-26 21:10:41 +080013355 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013356 ASSERT_VK_SUCCESS(err);
13357
Mike Stroyanaccf7692015-05-12 16:00:45 -060013358 err = vkResetEvent(device(), event);
13359 ASSERT_VK_SUCCESS(err);
13360
13361 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013362 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013363 data.event = event;
13364 data.bailout = false;
13365 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013366
13367 // First do some correct operations using multiple threads.
13368 // Add many entries to command buffer from another thread.
13369 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13370 // Make non-conflicting calls from this thread at the same time.
13371 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013372 uint32_t count;
13373 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013374 }
13375 test_platform_thread_join(thread, NULL);
13376
13377 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013378 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013379 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013380 // Add many entries to command buffer from this thread at the same time.
13381 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013382
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013383 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013384 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013385
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013386 m_errorMonitor->SetBailout(NULL);
13387
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013388 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013389
Chia-I Wuf7458c52015-10-26 21:10:41 +080013390 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013391}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013392#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013393
Karl Schultz6addd812016-02-02 17:17:23 -070013394TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013395 TEST_DESCRIPTION(
13396 "Test that an error is produced for a spirv module "
13397 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013398
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013400
Tony Barbour1fa09702017-03-16 12:09:08 -060013401 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13403
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013404 VkShaderModule module;
13405 VkShaderModuleCreateInfo moduleCreateInfo;
13406 struct icd_spv_header spv;
13407
13408 spv.magic = ICD_SPV_MAGIC;
13409 spv.version = ICD_SPV_VERSION;
13410 spv.gen_magic = 0;
13411
13412 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13413 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013414 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013415 moduleCreateInfo.codeSize = 4;
13416 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013417 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013418
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013419 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013420}
13421
Karl Schultz6addd812016-02-02 17:17:23 -070013422TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013423 TEST_DESCRIPTION(
13424 "Test that an error is produced for a spirv module "
13425 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013428
Tony Barbour1fa09702017-03-16 12:09:08 -060013429 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013430 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13431
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013432 VkShaderModule module;
13433 VkShaderModuleCreateInfo moduleCreateInfo;
13434 struct icd_spv_header spv;
13435
13436 spv.magic = ~ICD_SPV_MAGIC;
13437 spv.version = ICD_SPV_VERSION;
13438 spv.gen_magic = 0;
13439
13440 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13441 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013442 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13444 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013445 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013446
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013447 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013448}
13449
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013450#if 0
13451// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013452TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013454 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013455
Tony Barbour1fa09702017-03-16 12:09:08 -060013456 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13458
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013459 VkShaderModule module;
13460 VkShaderModuleCreateInfo moduleCreateInfo;
13461 struct icd_spv_header spv;
13462
13463 spv.magic = ICD_SPV_MAGIC;
13464 spv.version = ~ICD_SPV_VERSION;
13465 spv.gen_magic = 0;
13466
13467 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13468 moduleCreateInfo.pNext = NULL;
13469
Karl Schultz6addd812016-02-02 17:17:23 -070013470 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013471 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13472 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013473 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013475 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013476}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013477#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013478
Karl Schultz6addd812016-02-02 17:17:23 -070013479TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013480 TEST_DESCRIPTION(
13481 "Test that a warning is produced for a vertex output that "
13482 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013484
Tony Barbour1fa09702017-03-16 12:09:08 -060013485 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013487
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013488 char const *vsSource =
13489 "#version 450\n"
13490 "\n"
13491 "layout(location=0) out float x;\n"
13492 "out gl_PerVertex {\n"
13493 " vec4 gl_Position;\n"
13494 "};\n"
13495 "void main(){\n"
13496 " gl_Position = vec4(1);\n"
13497 " x = 0;\n"
13498 "}\n";
13499 char const *fsSource =
13500 "#version 450\n"
13501 "\n"
13502 "layout(location=0) out vec4 color;\n"
13503 "void main(){\n"
13504 " color = vec4(1);\n"
13505 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013506
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013509
13510 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013511 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013512 pipe.AddShader(&vs);
13513 pipe.AddShader(&fs);
13514
Chris Forbes9f7ff632015-05-25 11:13:08 +120013515 VkDescriptorSetObj descriptorSet(m_device);
13516 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013518
Tony Barbour5781e8f2015-08-04 16:23:11 -060013519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013521 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013522}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013523
Mark Mueller098c9cb2016-09-08 09:01:57 -060013524TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13525 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13526
Tony Barbour1fa09702017-03-16 12:09:08 -060013527 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13529
13530 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013531 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013532
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013533 char const *vsSource =
13534 "#version 450\n"
13535 "\n"
13536 "out gl_PerVertex {\n"
13537 " vec4 gl_Position;\n"
13538 "};\n"
13539 "void main(){\n"
13540 " gl_Position = vec4(1);\n"
13541 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013542
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013543 char const *fsSource =
13544 "#version 450\n"
13545 "\n"
13546 "layout (constant_id = 0) const float r = 0.0f;\n"
13547 "layout(location = 0) out vec4 uFragColor;\n"
13548 "void main(){\n"
13549 " uFragColor = vec4(r,1,0,1);\n"
13550 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013551
13552 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13553 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13554
13555 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13556 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13557
13558 VkPipelineLayout pipeline_layout;
13559 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13560
13561 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13562 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13563 vp_state_create_info.viewportCount = 1;
13564 VkViewport viewport = {};
13565 vp_state_create_info.pViewports = &viewport;
13566 vp_state_create_info.scissorCount = 1;
13567 VkRect2D scissors = {};
13568 vp_state_create_info.pScissors = &scissors;
13569
13570 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13571
13572 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13573 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13574 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13575 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13576
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013577 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013578
13579 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13580 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13581
13582 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13583 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13584 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13585
13586 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13587 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13588 rasterization_state_create_info.pNext = nullptr;
13589 rasterization_state_create_info.lineWidth = 1.0f;
13590 rasterization_state_create_info.rasterizerDiscardEnable = true;
13591
13592 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13593 color_blend_attachment_state.blendEnable = VK_FALSE;
13594 color_blend_attachment_state.colorWriteMask = 0xf;
13595
13596 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13597 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13598 color_blend_state_create_info.attachmentCount = 1;
13599 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13600
13601 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13602 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13603 graphicspipe_create_info.stageCount = 2;
13604 graphicspipe_create_info.pStages = shader_stage_create_info;
13605 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13606 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13607 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13608 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13609 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13610 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13611 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13612 graphicspipe_create_info.layout = pipeline_layout;
13613 graphicspipe_create_info.renderPass = renderPass();
13614
13615 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13616 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13617
13618 VkPipelineCache pipelineCache;
13619 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13620
13621 // This structure maps constant ids to data locations.
13622 const VkSpecializationMapEntry entry =
13623 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013624 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013625
13626 uint32_t data = 1;
13627
13628 // Set up the info describing spec map and data
13629 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013630 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013631 };
13632 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13633
13634 VkPipeline pipeline;
13635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13636 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13637 m_errorMonitor->VerifyFound();
13638
13639 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13640 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13641}
13642
13643TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13644 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13645
Tony Barbour1fa09702017-03-16 12:09:08 -060013646 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013647 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13648
13649 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13650
13651 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13652 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13653 descriptor_pool_type_count[0].descriptorCount = 1;
13654 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13655 descriptor_pool_type_count[1].descriptorCount = 1;
13656
13657 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13658 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13659 descriptor_pool_create_info.maxSets = 1;
13660 descriptor_pool_create_info.poolSizeCount = 2;
13661 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13662 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13663
13664 VkDescriptorPool descriptorset_pool;
13665 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13666
13667 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13668 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13669 descriptorset_layout_binding.descriptorCount = 1;
13670 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013671 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013672
13673 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13674 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13675 descriptorset_layout_create_info.bindingCount = 1;
13676 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13677
13678 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013679 ASSERT_VK_SUCCESS(
13680 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013681
13682 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13683 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13684 descriptorset_allocate_info.descriptorSetCount = 1;
13685 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13686 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13687 VkDescriptorSet descriptorset;
13688 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13689
13690 // Challenge core_validation with a non uniform buffer type.
13691 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13692
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013693 char const *vsSource =
13694 "#version 450\n"
13695 "\n"
13696 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13697 " mat4 mvp;\n"
13698 "} ubuf;\n"
13699 "out gl_PerVertex {\n"
13700 " vec4 gl_Position;\n"
13701 "};\n"
13702 "void main(){\n"
13703 " gl_Position = ubuf.mvp * vec4(1);\n"
13704 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013706 char const *fsSource =
13707 "#version 450\n"
13708 "\n"
13709 "layout(location = 0) out vec4 uFragColor;\n"
13710 "void main(){\n"
13711 " uFragColor = vec4(0,1,0,1);\n"
13712 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013713
13714 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13715 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13716
13717 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13718 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13719 pipeline_layout_create_info.setLayoutCount = 1;
13720 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13721
13722 VkPipelineLayout pipeline_layout;
13723 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13724
13725 VkPipelineObj pipe(m_device);
13726 pipe.AddColorAttachment();
13727 pipe.AddShader(&vs);
13728 pipe.AddShader(&fs);
13729
13730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13731 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13732 m_errorMonitor->VerifyFound();
13733
13734 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13735 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13736 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13737}
13738
13739TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13740 TEST_DESCRIPTION(
13741 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13742
Tony Barbour1fa09702017-03-16 12:09:08 -060013743 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13745
13746 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13747
13748 VkDescriptorPoolSize descriptor_pool_type_count = {};
13749 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13750 descriptor_pool_type_count.descriptorCount = 1;
13751
13752 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13753 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13754 descriptor_pool_create_info.maxSets = 1;
13755 descriptor_pool_create_info.poolSizeCount = 1;
13756 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13757 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13758
13759 VkDescriptorPool descriptorset_pool;
13760 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13761
13762 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13763 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13764 descriptorset_layout_binding.descriptorCount = 1;
13765 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13766 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013767 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013768
13769 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13770 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13771 descriptorset_layout_create_info.bindingCount = 1;
13772 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13773
13774 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013775 ASSERT_VK_SUCCESS(
13776 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013777
13778 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13779 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13780 descriptorset_allocate_info.descriptorSetCount = 1;
13781 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13782 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13783 VkDescriptorSet descriptorset;
13784 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13785
13786 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13787
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013788 char const *vsSource =
13789 "#version 450\n"
13790 "\n"
13791 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13792 " mat4 mvp;\n"
13793 "} ubuf;\n"
13794 "out gl_PerVertex {\n"
13795 " vec4 gl_Position;\n"
13796 "};\n"
13797 "void main(){\n"
13798 " gl_Position = ubuf.mvp * vec4(1);\n"
13799 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013800
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013801 char const *fsSource =
13802 "#version 450\n"
13803 "\n"
13804 "layout(location = 0) out vec4 uFragColor;\n"
13805 "void main(){\n"
13806 " uFragColor = vec4(0,1,0,1);\n"
13807 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013808
13809 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13810 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13811
13812 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13813 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13814 pipeline_layout_create_info.setLayoutCount = 1;
13815 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13816
13817 VkPipelineLayout pipeline_layout;
13818 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13819
13820 VkPipelineObj pipe(m_device);
13821 pipe.AddColorAttachment();
13822 pipe.AddShader(&vs);
13823 pipe.AddShader(&fs);
13824
13825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13826 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13827 m_errorMonitor->VerifyFound();
13828
13829 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13830 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13831 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13832}
13833
13834TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013835 TEST_DESCRIPTION(
13836 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13837 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013838
Tony Barbour1fa09702017-03-16 12:09:08 -060013839 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13841
13842 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013843 "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 -060013844
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013845 char const *vsSource =
13846 "#version 450\n"
13847 "\n"
13848 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13849 "out gl_PerVertex {\n"
13850 " vec4 gl_Position;\n"
13851 "};\n"
13852 "void main(){\n"
13853 " gl_Position = vec4(consts.x);\n"
13854 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013855
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013856 char const *fsSource =
13857 "#version 450\n"
13858 "\n"
13859 "layout(location = 0) out vec4 uFragColor;\n"
13860 "void main(){\n"
13861 " uFragColor = vec4(0,1,0,1);\n"
13862 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013863
13864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13865 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13866
13867 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13868 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13869
13870 // Set up a push constant range
13871 VkPushConstantRange push_constant_ranges = {};
13872 // Set to the wrong stage to challenge core_validation
13873 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13874 push_constant_ranges.size = 4;
13875
13876 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13877 pipeline_layout_create_info.pushConstantRangeCount = 1;
13878
13879 VkPipelineLayout pipeline_layout;
13880 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13881
13882 VkPipelineObj pipe(m_device);
13883 pipe.AddColorAttachment();
13884 pipe.AddShader(&vs);
13885 pipe.AddShader(&fs);
13886
13887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13888 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13889 m_errorMonitor->VerifyFound();
13890
13891 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13892}
13893
13894TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13895 TEST_DESCRIPTION(
13896 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13897
Tony Barbour1fa09702017-03-16 12:09:08 -060013898 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013899 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13900
13901 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013902 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013903
13904 // Some awkward steps are required to test with custom device features.
13905 std::vector<const char *> device_extension_names;
13906 auto features = m_device->phy().features();
13907 // Disable support for 64 bit floats
13908 features.shaderFloat64 = false;
13909 // The sacrificial device object
13910 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13911
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013912 char const *vsSource =
13913 "#version 450\n"
13914 "\n"
13915 "out gl_PerVertex {\n"
13916 " vec4 gl_Position;\n"
13917 "};\n"
13918 "void main(){\n"
13919 " gl_Position = vec4(1);\n"
13920 "}\n";
13921 char const *fsSource =
13922 "#version 450\n"
13923 "\n"
13924 "layout(location=0) out vec4 color;\n"
13925 "void main(){\n"
13926 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13927 " color = vec4(green);\n"
13928 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013929
13930 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13931 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13932
13933 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013934
13935 VkPipelineObj pipe(&test_device);
13936 pipe.AddColorAttachment();
13937 pipe.AddShader(&vs);
13938 pipe.AddShader(&fs);
13939
13940 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13941 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13942 VkPipelineLayout pipeline_layout;
13943 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13944
13945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13946 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13947 m_errorMonitor->VerifyFound();
13948
13949 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13950}
13951
Mark Lobodzinski20832822017-03-24 14:49:45 -060013952TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13953 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13954 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013955
Tony Barbour1fa09702017-03-16 12:09:08 -060013956 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13958
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013959 char const *vsSource =
13960 "#version 450\n"
13961 "\n"
13962 "out gl_PerVertex {\n"
13963 " vec4 gl_Position;\n"
13964 "};\n"
13965 "layout(xfb_buffer = 1) out;"
13966 "void main(){\n"
13967 " gl_Position = vec4(1);\n"
13968 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013969
Mark Lobodzinski20832822017-03-24 14:49:45 -060013970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013971
Mark Lobodzinski20832822017-03-24 14:49:45 -060013972 std::vector<unsigned int> spv;
13973 VkShaderModuleCreateInfo module_create_info;
13974 VkShaderModule shader_module;
13975 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13976 module_create_info.pNext = NULL;
13977 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13978 module_create_info.pCode = spv.data();
13979 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13980 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013981
Mark Lobodzinski20832822017-03-24 14:49:45 -060013982 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013983
Mark Lobodzinski20832822017-03-24 14:49:45 -060013984 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013985}
13986
Karl Schultz6addd812016-02-02 17:17:23 -070013987TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013988 TEST_DESCRIPTION(
13989 "Test that an error is produced for a fragment shader input "
13990 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013991
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013993
Tony Barbour1fa09702017-03-16 12:09:08 -060013994 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013996
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013997 char const *vsSource =
13998 "#version 450\n"
13999 "\n"
14000 "out gl_PerVertex {\n"
14001 " vec4 gl_Position;\n"
14002 "};\n"
14003 "void main(){\n"
14004 " gl_Position = vec4(1);\n"
14005 "}\n";
14006 char const *fsSource =
14007 "#version 450\n"
14008 "\n"
14009 "layout(location=0) in float x;\n"
14010 "layout(location=0) out vec4 color;\n"
14011 "void main(){\n"
14012 " color = vec4(x);\n"
14013 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014014
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014017
14018 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014019 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014020 pipe.AddShader(&vs);
14021 pipe.AddShader(&fs);
14022
Chris Forbes59cb88d2015-05-25 11:13:13 +120014023 VkDescriptorSetObj descriptorSet(m_device);
14024 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014025 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014026
Tony Barbour5781e8f2015-08-04 16:23:11 -060014027 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014028
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014029 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014030}
14031
Karl Schultz6addd812016-02-02 17:17:23 -070014032TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014033 TEST_DESCRIPTION(
14034 "Test that an error is produced for a fragment shader input "
14035 "within an interace block, which is not present in the outputs "
14036 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014038
Tony Barbour1fa09702017-03-16 12:09:08 -060014039 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14041
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014042 char const *vsSource =
14043 "#version 450\n"
14044 "\n"
14045 "out gl_PerVertex {\n"
14046 " vec4 gl_Position;\n"
14047 "};\n"
14048 "void main(){\n"
14049 " gl_Position = vec4(1);\n"
14050 "}\n";
14051 char const *fsSource =
14052 "#version 450\n"
14053 "\n"
14054 "in block { layout(location=0) float x; } ins;\n"
14055 "layout(location=0) out vec4 color;\n"
14056 "void main(){\n"
14057 " color = vec4(ins.x);\n"
14058 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014059
14060 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14061 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14062
14063 VkPipelineObj pipe(m_device);
14064 pipe.AddColorAttachment();
14065 pipe.AddShader(&vs);
14066 pipe.AddShader(&fs);
14067
14068 VkDescriptorSetObj descriptorSet(m_device);
14069 descriptorSet.AppendDummy();
14070 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14071
14072 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14073
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014074 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014075}
14076
Karl Schultz6addd812016-02-02 17:17:23 -070014077TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014078 TEST_DESCRIPTION(
14079 "Test that an error is produced for mismatched array sizes "
14080 "across the vertex->fragment shader interface");
14081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14082 "Type mismatch on location 0.0: 'ptr to "
14083 "output arr[2] of float32' vs 'ptr to "
14084 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014085
Tony Barbour1fa09702017-03-16 12:09:08 -060014086 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014089 char const *vsSource =
14090 "#version 450\n"
14091 "\n"
14092 "layout(location=0) out float x[2];\n"
14093 "out gl_PerVertex {\n"
14094 " vec4 gl_Position;\n"
14095 "};\n"
14096 "void main(){\n"
14097 " x[0] = 0; x[1] = 0;\n"
14098 " gl_Position = vec4(1);\n"
14099 "}\n";
14100 char const *fsSource =
14101 "#version 450\n"
14102 "\n"
14103 "layout(location=0) in float x[1];\n"
14104 "layout(location=0) out vec4 color;\n"
14105 "void main(){\n"
14106 " color = vec4(x[0]);\n"
14107 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014108
14109 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14110 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14111
14112 VkPipelineObj pipe(m_device);
14113 pipe.AddColorAttachment();
14114 pipe.AddShader(&vs);
14115 pipe.AddShader(&fs);
14116
14117 VkDescriptorSetObj descriptorSet(m_device);
14118 descriptorSet.AppendDummy();
14119 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14120
14121 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14122
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014123 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014124}
14125
Karl Schultz6addd812016-02-02 17:17:23 -070014126TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014127 TEST_DESCRIPTION(
14128 "Test that an error is produced for mismatched types across "
14129 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014131
Tony Barbour1fa09702017-03-16 12:09:08 -060014132 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014134
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014135 char const *vsSource =
14136 "#version 450\n"
14137 "\n"
14138 "layout(location=0) out int x;\n"
14139 "out gl_PerVertex {\n"
14140 " vec4 gl_Position;\n"
14141 "};\n"
14142 "void main(){\n"
14143 " x = 0;\n"
14144 " gl_Position = vec4(1);\n"
14145 "}\n";
14146 char const *fsSource =
14147 "#version 450\n"
14148 "\n"
14149 "layout(location=0) in float x;\n" /* VS writes int */
14150 "layout(location=0) out vec4 color;\n"
14151 "void main(){\n"
14152 " color = vec4(x);\n"
14153 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014154
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014155 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14156 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014157
14158 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014159 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014160 pipe.AddShader(&vs);
14161 pipe.AddShader(&fs);
14162
Chris Forbesb56af562015-05-25 11:13:17 +120014163 VkDescriptorSetObj descriptorSet(m_device);
14164 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014165 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014166
Tony Barbour5781e8f2015-08-04 16:23:11 -060014167 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014168
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014169 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014170}
14171
Karl Schultz6addd812016-02-02 17:17:23 -070014172TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014173 TEST_DESCRIPTION(
14174 "Test that an error is produced for mismatched types across "
14175 "the vertex->fragment shader interface, when the variable is contained within "
14176 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014178
Tony Barbour1fa09702017-03-16 12:09:08 -060014179 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14181
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014182 char const *vsSource =
14183 "#version 450\n"
14184 "\n"
14185 "out block { layout(location=0) int x; } outs;\n"
14186 "out gl_PerVertex {\n"
14187 " vec4 gl_Position;\n"
14188 "};\n"
14189 "void main(){\n"
14190 " outs.x = 0;\n"
14191 " gl_Position = vec4(1);\n"
14192 "}\n";
14193 char const *fsSource =
14194 "#version 450\n"
14195 "\n"
14196 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14197 "layout(location=0) out vec4 color;\n"
14198 "void main(){\n"
14199 " color = vec4(ins.x);\n"
14200 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014201
14202 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14203 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14204
14205 VkPipelineObj pipe(m_device);
14206 pipe.AddColorAttachment();
14207 pipe.AddShader(&vs);
14208 pipe.AddShader(&fs);
14209
14210 VkDescriptorSetObj descriptorSet(m_device);
14211 descriptorSet.AppendDummy();
14212 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14213
14214 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14215
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014216 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014217}
14218
14219TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014220 TEST_DESCRIPTION(
14221 "Test that an error is produced for location mismatches across "
14222 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14223 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014224 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 +130014225
Tony Barbour1fa09702017-03-16 12:09:08 -060014226 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14228
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014229 char const *vsSource =
14230 "#version 450\n"
14231 "\n"
14232 "out block { layout(location=1) float x; } outs;\n"
14233 "out gl_PerVertex {\n"
14234 " vec4 gl_Position;\n"
14235 "};\n"
14236 "void main(){\n"
14237 " outs.x = 0;\n"
14238 " gl_Position = vec4(1);\n"
14239 "}\n";
14240 char const *fsSource =
14241 "#version 450\n"
14242 "\n"
14243 "in block { layout(location=0) float x; } ins;\n"
14244 "layout(location=0) out vec4 color;\n"
14245 "void main(){\n"
14246 " color = vec4(ins.x);\n"
14247 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014248
14249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14251
14252 VkPipelineObj pipe(m_device);
14253 pipe.AddColorAttachment();
14254 pipe.AddShader(&vs);
14255 pipe.AddShader(&fs);
14256
14257 VkDescriptorSetObj descriptorSet(m_device);
14258 descriptorSet.AppendDummy();
14259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14260
14261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14262
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014263 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014264}
14265
14266TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014267 TEST_DESCRIPTION(
14268 "Test that an error is produced for component mismatches across the "
14269 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14270 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014271 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 +130014272
Tony Barbour1fa09702017-03-16 12:09:08 -060014273 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14275
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014276 char const *vsSource =
14277 "#version 450\n"
14278 "\n"
14279 "out block { layout(location=0, component=0) float x; } outs;\n"
14280 "out gl_PerVertex {\n"
14281 " vec4 gl_Position;\n"
14282 "};\n"
14283 "void main(){\n"
14284 " outs.x = 0;\n"
14285 " gl_Position = vec4(1);\n"
14286 "}\n";
14287 char const *fsSource =
14288 "#version 450\n"
14289 "\n"
14290 "in block { layout(location=0, component=1) float x; } ins;\n"
14291 "layout(location=0) out vec4 color;\n"
14292 "void main(){\n"
14293 " color = vec4(ins.x);\n"
14294 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014295
14296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14298
14299 VkPipelineObj pipe(m_device);
14300 pipe.AddColorAttachment();
14301 pipe.AddShader(&vs);
14302 pipe.AddShader(&fs);
14303
14304 VkDescriptorSetObj descriptorSet(m_device);
14305 descriptorSet.AppendDummy();
14306 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14307
14308 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14309
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014310 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014311}
14312
Chris Forbes1f3b0152016-11-30 12:48:40 +130014313TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14314 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14315
Tony Barbour1fa09702017-03-16 12:09:08 -060014316 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014317 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014319 char const *vsSource =
14320 "#version 450\n"
14321 "layout(location=0) out mediump float x;\n"
14322 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14323 char const *fsSource =
14324 "#version 450\n"
14325 "layout(location=0) in highp float x;\n"
14326 "layout(location=0) out vec4 color;\n"
14327 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014328
14329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14331
14332 VkPipelineObj pipe(m_device);
14333 pipe.AddColorAttachment();
14334 pipe.AddShader(&vs);
14335 pipe.AddShader(&fs);
14336
14337 VkDescriptorSetObj descriptorSet(m_device);
14338 descriptorSet.AppendDummy();
14339 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14340
14341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14342
14343 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14344
14345 m_errorMonitor->VerifyFound();
14346}
14347
Chris Forbes870a39e2016-11-30 12:55:56 +130014348TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14349 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14350
Tony Barbour1fa09702017-03-16 12:09:08 -060014351 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14353
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014354 char const *vsSource =
14355 "#version 450\n"
14356 "out block { layout(location=0) mediump float x; };\n"
14357 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14358 char const *fsSource =
14359 "#version 450\n"
14360 "in block { layout(location=0) highp float x; };\n"
14361 "layout(location=0) out vec4 color;\n"
14362 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014363
14364 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14365 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14366
14367 VkPipelineObj pipe(m_device);
14368 pipe.AddColorAttachment();
14369 pipe.AddShader(&vs);
14370 pipe.AddShader(&fs);
14371
14372 VkDescriptorSetObj descriptorSet(m_device);
14373 descriptorSet.AppendDummy();
14374 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14375
14376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14377
14378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14379
14380 m_errorMonitor->VerifyFound();
14381}
14382
Karl Schultz6addd812016-02-02 17:17:23 -070014383TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014384 TEST_DESCRIPTION(
14385 "Test that a warning is produced for a vertex attribute which is "
14386 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014388
Tony Barbour1fa09702017-03-16 12:09:08 -060014389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014391
14392 VkVertexInputBindingDescription input_binding;
14393 memset(&input_binding, 0, sizeof(input_binding));
14394
14395 VkVertexInputAttributeDescription input_attrib;
14396 memset(&input_attrib, 0, sizeof(input_attrib));
14397 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14398
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014399 char const *vsSource =
14400 "#version 450\n"
14401 "\n"
14402 "out gl_PerVertex {\n"
14403 " vec4 gl_Position;\n"
14404 "};\n"
14405 "void main(){\n"
14406 " gl_Position = vec4(1);\n"
14407 "}\n";
14408 char const *fsSource =
14409 "#version 450\n"
14410 "\n"
14411 "layout(location=0) out vec4 color;\n"
14412 "void main(){\n"
14413 " color = vec4(1);\n"
14414 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014415
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014416 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14417 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014418
14419 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014420 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014421 pipe.AddShader(&vs);
14422 pipe.AddShader(&fs);
14423
14424 pipe.AddVertexInputBindings(&input_binding, 1);
14425 pipe.AddVertexInputAttribs(&input_attrib, 1);
14426
Chris Forbesde136e02015-05-25 11:13:28 +120014427 VkDescriptorSetObj descriptorSet(m_device);
14428 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014429 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014430
Tony Barbour5781e8f2015-08-04 16:23:11 -060014431 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014432
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014433 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014434}
14435
Karl Schultz6addd812016-02-02 17:17:23 -070014436TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014437 TEST_DESCRIPTION(
14438 "Test that a warning is produced for a location mismatch on "
14439 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014441
Tony Barbour1fa09702017-03-16 12:09:08 -060014442 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14444
14445 VkVertexInputBindingDescription input_binding;
14446 memset(&input_binding, 0, sizeof(input_binding));
14447
14448 VkVertexInputAttributeDescription input_attrib;
14449 memset(&input_attrib, 0, sizeof(input_attrib));
14450 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014452 char const *vsSource =
14453 "#version 450\n"
14454 "\n"
14455 "layout(location=1) in float x;\n"
14456 "out gl_PerVertex {\n"
14457 " vec4 gl_Position;\n"
14458 "};\n"
14459 "void main(){\n"
14460 " gl_Position = vec4(x);\n"
14461 "}\n";
14462 char const *fsSource =
14463 "#version 450\n"
14464 "\n"
14465 "layout(location=0) out vec4 color;\n"
14466 "void main(){\n"
14467 " color = vec4(1);\n"
14468 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014469
14470 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14471 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14472
14473 VkPipelineObj pipe(m_device);
14474 pipe.AddColorAttachment();
14475 pipe.AddShader(&vs);
14476 pipe.AddShader(&fs);
14477
14478 pipe.AddVertexInputBindings(&input_binding, 1);
14479 pipe.AddVertexInputAttribs(&input_attrib, 1);
14480
14481 VkDescriptorSetObj descriptorSet(m_device);
14482 descriptorSet.AppendDummy();
14483 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14484
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014485 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014486 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014488 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014489}
14490
Karl Schultz6addd812016-02-02 17:17:23 -070014491TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014492 TEST_DESCRIPTION(
14493 "Test that an error is produced for a vertex shader input which is not "
14494 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14496 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014497
Tony Barbour1fa09702017-03-16 12:09:08 -060014498 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014500
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014501 char const *vsSource =
14502 "#version 450\n"
14503 "\n"
14504 "layout(location=0) in vec4 x;\n" /* not provided */
14505 "out gl_PerVertex {\n"
14506 " vec4 gl_Position;\n"
14507 "};\n"
14508 "void main(){\n"
14509 " gl_Position = x;\n"
14510 "}\n";
14511 char const *fsSource =
14512 "#version 450\n"
14513 "\n"
14514 "layout(location=0) out vec4 color;\n"
14515 "void main(){\n"
14516 " color = vec4(1);\n"
14517 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014518
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014521
14522 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014523 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014524 pipe.AddShader(&vs);
14525 pipe.AddShader(&fs);
14526
Chris Forbes62e8e502015-05-25 11:13:29 +120014527 VkDescriptorSetObj descriptorSet(m_device);
14528 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014530
Tony Barbour5781e8f2015-08-04 16:23:11 -060014531 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014532
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014533 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014534}
14535
Karl Schultz6addd812016-02-02 17:17:23 -070014536TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014537 TEST_DESCRIPTION(
14538 "Test that an error is produced for a mismatch between the "
14539 "fundamental type (float/int/uint) of an attribute and the "
14540 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014541 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 -060014542
Tony Barbour1fa09702017-03-16 12:09:08 -060014543 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014545
14546 VkVertexInputBindingDescription input_binding;
14547 memset(&input_binding, 0, sizeof(input_binding));
14548
14549 VkVertexInputAttributeDescription input_attrib;
14550 memset(&input_attrib, 0, sizeof(input_attrib));
14551 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14552
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014553 char const *vsSource =
14554 "#version 450\n"
14555 "\n"
14556 "layout(location=0) in int x;\n" /* attrib provided float */
14557 "out gl_PerVertex {\n"
14558 " vec4 gl_Position;\n"
14559 "};\n"
14560 "void main(){\n"
14561 " gl_Position = vec4(x);\n"
14562 "}\n";
14563 char const *fsSource =
14564 "#version 450\n"
14565 "\n"
14566 "layout(location=0) out vec4 color;\n"
14567 "void main(){\n"
14568 " color = vec4(1);\n"
14569 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014570
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14572 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014573
14574 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014575 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014576 pipe.AddShader(&vs);
14577 pipe.AddShader(&fs);
14578
14579 pipe.AddVertexInputBindings(&input_binding, 1);
14580 pipe.AddVertexInputAttribs(&input_attrib, 1);
14581
Chris Forbesc97d98e2015-05-25 11:13:31 +120014582 VkDescriptorSetObj descriptorSet(m_device);
14583 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014584 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014585
Tony Barbour5781e8f2015-08-04 16:23:11 -060014586 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014587
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014588 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014589}
14590
Chris Forbesc68b43c2016-04-06 11:18:47 +120014591TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014592 TEST_DESCRIPTION(
14593 "Test that an error is produced for a pipeline containing multiple "
14594 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14596 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014597
Tony Barbour1fa09702017-03-16 12:09:08 -060014598 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14600
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014601 char const *vsSource =
14602 "#version 450\n"
14603 "\n"
14604 "out gl_PerVertex {\n"
14605 " vec4 gl_Position;\n"
14606 "};\n"
14607 "void main(){\n"
14608 " gl_Position = vec4(1);\n"
14609 "}\n";
14610 char const *fsSource =
14611 "#version 450\n"
14612 "\n"
14613 "layout(location=0) out vec4 color;\n"
14614 "void main(){\n"
14615 " color = vec4(1);\n"
14616 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014617
14618 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14619 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14620
14621 VkPipelineObj pipe(m_device);
14622 pipe.AddColorAttachment();
14623 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014624 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014625 pipe.AddShader(&fs);
14626
14627 VkDescriptorSetObj descriptorSet(m_device);
14628 descriptorSet.AppendDummy();
14629 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14630
14631 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14632
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014633 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014634}
14635
Chris Forbes82ff92a2016-09-09 10:50:24 +120014636TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014638
Tony Barbour1fa09702017-03-16 12:09:08 -060014639 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14641
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014642 char const *vsSource =
14643 "#version 450\n"
14644 "out gl_PerVertex {\n"
14645 " vec4 gl_Position;\n"
14646 "};\n"
14647 "void main(){\n"
14648 " gl_Position = vec4(0);\n"
14649 "}\n";
14650 char const *fsSource =
14651 "#version 450\n"
14652 "\n"
14653 "layout(location=0) out vec4 color;\n"
14654 "void main(){\n"
14655 " color = vec4(1);\n"
14656 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014657
14658 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14659 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14660
14661 VkPipelineObj pipe(m_device);
14662 pipe.AddColorAttachment();
14663 pipe.AddShader(&vs);
14664 pipe.AddShader(&fs);
14665
14666 VkDescriptorSetObj descriptorSet(m_device);
14667 descriptorSet.AppendDummy();
14668 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14669
14670 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14671
14672 m_errorMonitor->VerifyFound();
14673}
14674
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014675TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14677 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14678 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014679
Tony Barbour1fa09702017-03-16 12:09:08 -060014680 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014683 char const *vsSource =
14684 "#version 450\n"
14685 "void main(){ gl_Position = vec4(0); }\n";
14686 char const *fsSource =
14687 "#version 450\n"
14688 "\n"
14689 "layout(location=0) out vec4 color;\n"
14690 "void main(){\n"
14691 " color = vec4(1);\n"
14692 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014693
14694 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14695 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14696
14697 VkPipelineObj pipe(m_device);
14698 pipe.AddColorAttachment();
14699 pipe.AddShader(&vs);
14700 pipe.AddShader(&fs);
14701
14702 VkDescriptorSetObj descriptorSet(m_device);
14703 descriptorSet.AppendDummy();
14704 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14705
14706 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014707 {
14708 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14709 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14710 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014711 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014712 {
14713 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14714 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14715 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014716 },
14717 };
14718 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014719 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014720 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014721 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14722 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014723 VkRenderPass rp;
14724 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14725 ASSERT_VK_SUCCESS(err);
14726
14727 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14728
14729 m_errorMonitor->VerifyFound();
14730
14731 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14732}
14733
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014734TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014735 TEST_DESCRIPTION(
14736 "Test that an error is produced for a variable output from "
14737 "the TCS without the patch decoration, but consumed in the TES "
14738 "with the decoration.");
14739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14740 "is per-vertex in tessellation control shader stage "
14741 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014742
Tony Barbour1fa09702017-03-16 12:09:08 -060014743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14745
Chris Forbesc1e852d2016-04-04 19:26:42 +120014746 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014747 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014748 return;
14749 }
14750
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014751 char const *vsSource =
14752 "#version 450\n"
14753 "void main(){}\n";
14754 char const *tcsSource =
14755 "#version 450\n"
14756 "layout(location=0) out int x[];\n"
14757 "layout(vertices=3) out;\n"
14758 "void main(){\n"
14759 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14760 " gl_TessLevelInner[0] = 1;\n"
14761 " x[gl_InvocationID] = gl_InvocationID;\n"
14762 "}\n";
14763 char const *tesSource =
14764 "#version 450\n"
14765 "layout(triangles, equal_spacing, cw) in;\n"
14766 "layout(location=0) patch in int x;\n"
14767 "out gl_PerVertex { vec4 gl_Position; };\n"
14768 "void main(){\n"
14769 " gl_Position.xyz = gl_TessCoord;\n"
14770 " gl_Position.w = x;\n"
14771 "}\n";
14772 char const *fsSource =
14773 "#version 450\n"
14774 "layout(location=0) out vec4 color;\n"
14775 "void main(){\n"
14776 " color = vec4(1);\n"
14777 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014778
14779 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14780 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14781 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14782 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14783
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014784 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14785 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014786
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014787 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014788
14789 VkPipelineObj pipe(m_device);
14790 pipe.SetInputAssembly(&iasci);
14791 pipe.SetTessellation(&tsci);
14792 pipe.AddColorAttachment();
14793 pipe.AddShader(&vs);
14794 pipe.AddShader(&tcs);
14795 pipe.AddShader(&tes);
14796 pipe.AddShader(&fs);
14797
14798 VkDescriptorSetObj descriptorSet(m_device);
14799 descriptorSet.AppendDummy();
14800 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14801
14802 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14803
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014804 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014805}
14806
Karl Schultz6addd812016-02-02 17:17:23 -070014807TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014808 TEST_DESCRIPTION(
14809 "Test that an error is produced for a vertex attribute setup where multiple "
14810 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14812 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014813
Tony Barbour1fa09702017-03-16 12:09:08 -060014814 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014816
14817 /* Two binding descriptions for binding 0 */
14818 VkVertexInputBindingDescription input_bindings[2];
14819 memset(input_bindings, 0, sizeof(input_bindings));
14820
14821 VkVertexInputAttributeDescription input_attrib;
14822 memset(&input_attrib, 0, sizeof(input_attrib));
14823 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14824
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014825 char const *vsSource =
14826 "#version 450\n"
14827 "\n"
14828 "layout(location=0) in float x;\n" /* attrib provided float */
14829 "out gl_PerVertex {\n"
14830 " vec4 gl_Position;\n"
14831 "};\n"
14832 "void main(){\n"
14833 " gl_Position = vec4(x);\n"
14834 "}\n";
14835 char const *fsSource =
14836 "#version 450\n"
14837 "\n"
14838 "layout(location=0) out vec4 color;\n"
14839 "void main(){\n"
14840 " color = vec4(1);\n"
14841 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014842
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014845
14846 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014847 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014848 pipe.AddShader(&vs);
14849 pipe.AddShader(&fs);
14850
14851 pipe.AddVertexInputBindings(input_bindings, 2);
14852 pipe.AddVertexInputAttribs(&input_attrib, 1);
14853
Chris Forbes280ba2c2015-06-12 11:16:41 +120014854 VkDescriptorSetObj descriptorSet(m_device);
14855 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014856 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014857
Tony Barbour5781e8f2015-08-04 16:23:11 -060014858 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014859
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014860 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014861}
Chris Forbes8f68b562015-05-25 11:13:32 +120014862
Karl Schultz6addd812016-02-02 17:17:23 -070014863TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014864 TEST_DESCRIPTION(
14865 "Test that an error is produced for a fragment shader which does not "
14866 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014868
Tony Barbour1fa09702017-03-16 12:09:08 -060014869 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014870
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014871 char const *vsSource =
14872 "#version 450\n"
14873 "\n"
14874 "out gl_PerVertex {\n"
14875 " vec4 gl_Position;\n"
14876 "};\n"
14877 "void main(){\n"
14878 " gl_Position = vec4(1);\n"
14879 "}\n";
14880 char const *fsSource =
14881 "#version 450\n"
14882 "\n"
14883 "void main(){\n"
14884 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014885
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014886 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14887 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014888
14889 VkPipelineObj pipe(m_device);
14890 pipe.AddShader(&vs);
14891 pipe.AddShader(&fs);
14892
Chia-I Wu08accc62015-07-07 11:50:03 +080014893 /* set up CB 0, not written */
14894 pipe.AddColorAttachment();
14895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014896
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897 VkDescriptorSetObj descriptorSet(m_device);
14898 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014899 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014900
Tony Barbour5781e8f2015-08-04 16:23:11 -060014901 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014902
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014903 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014904}
14905
Karl Schultz6addd812016-02-02 17:17:23 -070014906TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014907 TEST_DESCRIPTION(
14908 "Test that a warning is produced for a fragment shader which provides a spurious "
14909 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014911 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014912
Tony Barbour1fa09702017-03-16 12:09:08 -060014913 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014914
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014915 char const *vsSource =
14916 "#version 450\n"
14917 "\n"
14918 "out gl_PerVertex {\n"
14919 " vec4 gl_Position;\n"
14920 "};\n"
14921 "void main(){\n"
14922 " gl_Position = vec4(1);\n"
14923 "}\n";
14924 char const *fsSource =
14925 "#version 450\n"
14926 "\n"
14927 "layout(location=0) out vec4 x;\n"
14928 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14929 "void main(){\n"
14930 " x = vec4(1);\n"
14931 " y = vec4(1);\n"
14932 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014933
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014936
14937 VkPipelineObj pipe(m_device);
14938 pipe.AddShader(&vs);
14939 pipe.AddShader(&fs);
14940
Chia-I Wu08accc62015-07-07 11:50:03 +080014941 /* set up CB 0, not written */
14942 pipe.AddColorAttachment();
14943 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014944 /* FS writes CB 1, but we don't configure it */
14945
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014946 VkDescriptorSetObj descriptorSet(m_device);
14947 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014948 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014949
Tony Barbour5781e8f2015-08-04 16:23:11 -060014950 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014951
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014952 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014953}
14954
Karl Schultz6addd812016-02-02 17:17:23 -070014955TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014956 TEST_DESCRIPTION(
14957 "Test that an error is produced for a mismatch between the fundamental "
14958 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014960
Tony Barbour1fa09702017-03-16 12:09:08 -060014961 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014962
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014963 char const *vsSource =
14964 "#version 450\n"
14965 "\n"
14966 "out gl_PerVertex {\n"
14967 " vec4 gl_Position;\n"
14968 "};\n"
14969 "void main(){\n"
14970 " gl_Position = vec4(1);\n"
14971 "}\n";
14972 char const *fsSource =
14973 "#version 450\n"
14974 "\n"
14975 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14976 "void main(){\n"
14977 " x = ivec4(1);\n"
14978 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014979
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014980 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14981 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014982
14983 VkPipelineObj pipe(m_device);
14984 pipe.AddShader(&vs);
14985 pipe.AddShader(&fs);
14986
Chia-I Wu08accc62015-07-07 11:50:03 +080014987 /* set up CB 0; type is UNORM by default */
14988 pipe.AddColorAttachment();
14989 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014990
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991 VkDescriptorSetObj descriptorSet(m_device);
14992 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014993 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014994
Tony Barbour5781e8f2015-08-04 16:23:11 -060014995 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014996
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014997 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014998}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014999
Karl Schultz6addd812016-02-02 17:17:23 -070015000TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015001 TEST_DESCRIPTION(
15002 "Test that an error is produced for a shader consuming a uniform "
15003 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015005
Tony Barbour1fa09702017-03-16 12:09:08 -060015006 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015007
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015008 char const *vsSource =
15009 "#version 450\n"
15010 "\n"
15011 "out gl_PerVertex {\n"
15012 " vec4 gl_Position;\n"
15013 "};\n"
15014 "void main(){\n"
15015 " gl_Position = vec4(1);\n"
15016 "}\n";
15017 char const *fsSource =
15018 "#version 450\n"
15019 "\n"
15020 "layout(location=0) out vec4 x;\n"
15021 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15022 "void main(){\n"
15023 " x = vec4(bar.y);\n"
15024 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015025
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015026 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15027 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015028
Chris Forbes556c76c2015-08-14 12:04:59 +120015029 VkPipelineObj pipe(m_device);
15030 pipe.AddShader(&vs);
15031 pipe.AddShader(&fs);
15032
15033 /* set up CB 0; type is UNORM by default */
15034 pipe.AddColorAttachment();
15035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15036
15037 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015038 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015039
15040 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15041
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015042 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015043}
15044
Chris Forbes5c59e902016-02-26 16:56:09 +130015045TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015046 TEST_DESCRIPTION(
15047 "Test that an error is produced for a shader consuming push constants "
15048 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015050
Tony Barbour1fa09702017-03-16 12:09:08 -060015051 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015052
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015053 char const *vsSource =
15054 "#version 450\n"
15055 "\n"
15056 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15057 "out gl_PerVertex {\n"
15058 " vec4 gl_Position;\n"
15059 "};\n"
15060 "void main(){\n"
15061 " gl_Position = vec4(consts.x);\n"
15062 "}\n";
15063 char const *fsSource =
15064 "#version 450\n"
15065 "\n"
15066 "layout(location=0) out vec4 x;\n"
15067 "void main(){\n"
15068 " x = vec4(1);\n"
15069 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015070
15071 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15072 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15073
15074 VkPipelineObj pipe(m_device);
15075 pipe.AddShader(&vs);
15076 pipe.AddShader(&fs);
15077
15078 /* set up CB 0; type is UNORM by default */
15079 pipe.AddColorAttachment();
15080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15081
15082 VkDescriptorSetObj descriptorSet(m_device);
15083 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15084
15085 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15086
15087 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015088 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015089}
15090
Chris Forbes3fb17902016-08-22 14:57:55 +120015091TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015092 TEST_DESCRIPTION(
15093 "Test that an error is produced for a shader consuming an input attachment "
15094 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15096 "consumes input attachment index 0 but not provided in subpass");
15097
Tony Barbour1fa09702017-03-16 12:09:08 -060015098 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015099
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015100 char const *vsSource =
15101 "#version 450\n"
15102 "\n"
15103 "out gl_PerVertex {\n"
15104 " vec4 gl_Position;\n"
15105 "};\n"
15106 "void main(){\n"
15107 " gl_Position = vec4(1);\n"
15108 "}\n";
15109 char const *fsSource =
15110 "#version 450\n"
15111 "\n"
15112 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15113 "layout(location=0) out vec4 color;\n"
15114 "void main() {\n"
15115 " color = subpassLoad(x);\n"
15116 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015117
15118 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15119 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15120
15121 VkPipelineObj pipe(m_device);
15122 pipe.AddShader(&vs);
15123 pipe.AddShader(&fs);
15124 pipe.AddColorAttachment();
15125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015127 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15128 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015129 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015130 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015131 ASSERT_VK_SUCCESS(err);
15132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015133 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015134 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015135 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015136 ASSERT_VK_SUCCESS(err);
15137
15138 // error here.
15139 pipe.CreateVKPipeline(pl, renderPass());
15140
15141 m_errorMonitor->VerifyFound();
15142
15143 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15144 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15145}
15146
Chris Forbes5a9a0472016-08-22 16:02:09 +120015147TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015148 TEST_DESCRIPTION(
15149 "Test that an error is produced for a shader consuming an input attachment "
15150 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15152 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15153
Tony Barbour1fa09702017-03-16 12:09:08 -060015154 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015155
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015156 char const *vsSource =
15157 "#version 450\n"
15158 "\n"
15159 "out gl_PerVertex {\n"
15160 " vec4 gl_Position;\n"
15161 "};\n"
15162 "void main(){\n"
15163 " gl_Position = vec4(1);\n"
15164 "}\n";
15165 char const *fsSource =
15166 "#version 450\n"
15167 "\n"
15168 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15169 "layout(location=0) out vec4 color;\n"
15170 "void main() {\n"
15171 " color = subpassLoad(x);\n"
15172 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015173
15174 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15175 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15176
15177 VkPipelineObj pipe(m_device);
15178 pipe.AddShader(&vs);
15179 pipe.AddShader(&fs);
15180 pipe.AddColorAttachment();
15181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015183 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15184 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015185 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015186 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015187 ASSERT_VK_SUCCESS(err);
15188
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015189 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015190 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015191 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015192 ASSERT_VK_SUCCESS(err);
15193
15194 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015195 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15196 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15197 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15198 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15199 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 +120015200 };
15201 VkAttachmentReference color = {
15202 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15203 };
15204 VkAttachmentReference input = {
15205 1, VK_IMAGE_LAYOUT_GENERAL,
15206 };
15207
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015208 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015209
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015210 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015211 VkRenderPass rp;
15212 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15213 ASSERT_VK_SUCCESS(err);
15214
15215 // error here.
15216 pipe.CreateVKPipeline(pl, rp);
15217
15218 m_errorMonitor->VerifyFound();
15219
15220 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15221 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15222 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15223}
15224
Chris Forbes541f7b02016-08-22 15:30:27 +120015225TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015226 TEST_DESCRIPTION(
15227 "Test that an error is produced for a shader consuming an input attachment "
15228 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015230 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015231
Tony Barbour1fa09702017-03-16 12:09:08 -060015232 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015233
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015234 char const *vsSource =
15235 "#version 450\n"
15236 "\n"
15237 "out gl_PerVertex {\n"
15238 " vec4 gl_Position;\n"
15239 "};\n"
15240 "void main(){\n"
15241 " gl_Position = vec4(1);\n"
15242 "}\n";
15243 char const *fsSource =
15244 "#version 450\n"
15245 "\n"
15246 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15247 "layout(location=0) out vec4 color;\n"
15248 "void main() {\n"
15249 " color = subpassLoad(xs[0]);\n"
15250 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015251
15252 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15253 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15254
15255 VkPipelineObj pipe(m_device);
15256 pipe.AddShader(&vs);
15257 pipe.AddShader(&fs);
15258 pipe.AddColorAttachment();
15259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15260
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015261 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15262 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015263 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015264 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015265 ASSERT_VK_SUCCESS(err);
15266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015267 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015268 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015269 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015270 ASSERT_VK_SUCCESS(err);
15271
15272 // error here.
15273 pipe.CreateVKPipeline(pl, renderPass());
15274
15275 m_errorMonitor->VerifyFound();
15276
15277 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15278 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15279}
15280
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015281TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015282 TEST_DESCRIPTION(
15283 "Test that an error is produced for a compute pipeline consuming a "
15284 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015286
Tony Barbour1fa09702017-03-16 12:09:08 -060015287 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015288
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015289 char const *csSource =
15290 "#version 450\n"
15291 "\n"
15292 "layout(local_size_x=1) in;\n"
15293 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15294 "void main(){\n"
15295 " x = vec4(1);\n"
15296 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015297
15298 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15299
15300 VkDescriptorSetObj descriptorSet(m_device);
15301 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015303 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15304 nullptr,
15305 0,
15306 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15307 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15308 descriptorSet.GetPipelineLayout(),
15309 VK_NULL_HANDLE,
15310 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015311
15312 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015313 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015314
15315 m_errorMonitor->VerifyFound();
15316
15317 if (err == VK_SUCCESS) {
15318 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15319 }
15320}
15321
Chris Forbes22a9b092016-07-19 14:34:05 +120015322TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015323 TEST_DESCRIPTION(
15324 "Test that an error is produced for a pipeline consuming a "
15325 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15327 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015328
Tony Barbour1fa09702017-03-16 12:09:08 -060015329 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015331 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15332 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015333 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015334 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015335 ASSERT_VK_SUCCESS(err);
15336
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015337 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015338 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015339 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015340 ASSERT_VK_SUCCESS(err);
15341
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015342 char const *csSource =
15343 "#version 450\n"
15344 "\n"
15345 "layout(local_size_x=1) in;\n"
15346 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15347 "void main() {\n"
15348 " x.x = 1.0f;\n"
15349 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015350 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015352 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15353 nullptr,
15354 0,
15355 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15356 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15357 pl,
15358 VK_NULL_HANDLE,
15359 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015360
15361 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015362 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015363
15364 m_errorMonitor->VerifyFound();
15365
15366 if (err == VK_SUCCESS) {
15367 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15368 }
15369
15370 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15371 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15372}
15373
Chris Forbes50020592016-07-27 13:52:41 +120015374TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015375 TEST_DESCRIPTION(
15376 "Test that an error is produced when an image view type "
15377 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015379 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 +120015380
Tony Barbour1fa09702017-03-16 12:09:08 -060015381 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15383
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015384 char const *vsSource =
15385 "#version 450\n"
15386 "\n"
15387 "out gl_PerVertex { vec4 gl_Position; };\n"
15388 "void main() { gl_Position = vec4(0); }\n";
15389 char const *fsSource =
15390 "#version 450\n"
15391 "\n"
15392 "layout(set=0, binding=0) uniform sampler3D s;\n"
15393 "layout(location=0) out vec4 color;\n"
15394 "void main() {\n"
15395 " color = texture(s, vec3(0));\n"
15396 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015397 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15398 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15399
15400 VkPipelineObj pipe(m_device);
15401 pipe.AddShader(&vs);
15402 pipe.AddShader(&fs);
15403 pipe.AddColorAttachment();
15404
15405 VkTextureObj texture(m_device, nullptr);
15406 VkSamplerObj sampler(m_device);
15407
15408 VkDescriptorSetObj descriptorSet(m_device);
15409 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15410 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15411
15412 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15413 ASSERT_VK_SUCCESS(err);
15414
Tony Barbour552f6c02016-12-21 14:34:07 -070015415 m_commandBuffer->BeginCommandBuffer();
15416 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015417
15418 m_commandBuffer->BindPipeline(pipe);
15419 m_commandBuffer->BindDescriptorSet(descriptorSet);
15420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015421 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015422 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015423 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015424 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15425
15426 // error produced here.
15427 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15428
15429 m_errorMonitor->VerifyFound();
15430
Tony Barbour552f6c02016-12-21 14:34:07 -070015431 m_commandBuffer->EndRenderPass();
15432 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015433}
15434
Chris Forbes5533bfc2016-07-27 14:12:34 +120015435TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015436 TEST_DESCRIPTION(
15437 "Test that an error is produced when a multisampled images "
15438 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015439
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015441
Tony Barbour1fa09702017-03-16 12:09:08 -060015442 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15444
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015445 char const *vsSource =
15446 "#version 450\n"
15447 "\n"
15448 "out gl_PerVertex { vec4 gl_Position; };\n"
15449 "void main() { gl_Position = vec4(0); }\n";
15450 char const *fsSource =
15451 "#version 450\n"
15452 "\n"
15453 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15454 "layout(location=0) out vec4 color;\n"
15455 "void main() {\n"
15456 " color = texelFetch(s, ivec2(0), 0);\n"
15457 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015458 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15459 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15460
15461 VkPipelineObj pipe(m_device);
15462 pipe.AddShader(&vs);
15463 pipe.AddShader(&fs);
15464 pipe.AddColorAttachment();
15465
15466 VkTextureObj texture(m_device, nullptr);
15467 VkSamplerObj sampler(m_device);
15468
15469 VkDescriptorSetObj descriptorSet(m_device);
15470 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15471 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15472
15473 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15474 ASSERT_VK_SUCCESS(err);
15475
Tony Barbour552f6c02016-12-21 14:34:07 -070015476 m_commandBuffer->BeginCommandBuffer();
15477 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015478
15479 m_commandBuffer->BindPipeline(pipe);
15480 m_commandBuffer->BindDescriptorSet(descriptorSet);
15481
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015483 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015484 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015485 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15486
15487 // error produced here.
15488 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15489
15490 m_errorMonitor->VerifyFound();
15491
Tony Barbour552f6c02016-12-21 14:34:07 -070015492 m_commandBuffer->EndRenderPass();
15493 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015494}
15495
Mark Youngc48c4c12016-04-11 14:26:49 -060015496TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015497 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015498
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015499 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15500 {
15501 VkFormatProperties properties;
15502 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15503 if (properties.optimalTilingFeatures == 0) {
15504 printf(" Image format not supported; skipped.\n");
15505 return;
15506 }
15507 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015508
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015509 VkImageCreateInfo info = {};
15510 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15511 info.pNext = NULL;
15512 info.imageType = VK_IMAGE_TYPE_2D;
15513 info.format = format;
15514 info.extent.height = 32;
15515 info.extent.depth = 1;
15516 info.mipLevels = 1;
15517 info.arrayLayers = 1;
15518 info.samples = VK_SAMPLE_COUNT_1_BIT;
15519 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15520 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15521 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015522
15523 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015524 {
15525 VkImageFormatProperties properties;
15526 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15527 info.tiling, info.usage, info.flags, &properties);
15528 ASSERT_VK_SUCCESS(result);
15529 info.extent.width = properties.maxExtent.width + 1;
15530 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015531
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015532 VkImage image;
15533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15534 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015535 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015536}
15537
Mark Youngc48c4c12016-04-11 14:26:49 -060015538TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015539 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015540
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015541 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15542 {
15543 VkFormatProperties properties;
15544 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15545 if (properties.optimalTilingFeatures == 0) {
15546 printf(" Image format not supported; skipped.\n");
15547 return;
15548 }
15549 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015550
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015551 VkImageCreateInfo info = {};
15552 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15553 info.pNext = NULL;
15554 info.imageType = VK_IMAGE_TYPE_2D;
15555 info.format = format;
15556 info.extent.height = 32;
15557 info.extent.depth = 1;
15558 info.mipLevels = 1;
15559 info.arrayLayers = 1;
15560 info.samples = VK_SAMPLE_COUNT_1_BIT;
15561 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15562 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15563 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015564
15565 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015566 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015567
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015568 VkImage image;
15569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15570 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15571 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015572 m_errorMonitor->VerifyFound();
15573}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015574
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015575TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015576 TEST_DESCRIPTION(
15577 "Create a render pass with an attachment description "
15578 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015579
Tony Barbour1fa09702017-03-16 12:09:08 -060015580 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015581 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15582
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015584
15585 VkAttachmentReference color_attach = {};
15586 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15587 color_attach.attachment = 0;
15588 VkSubpassDescription subpass = {};
15589 subpass.colorAttachmentCount = 1;
15590 subpass.pColorAttachments = &color_attach;
15591
15592 VkRenderPassCreateInfo rpci = {};
15593 rpci.subpassCount = 1;
15594 rpci.pSubpasses = &subpass;
15595 rpci.attachmentCount = 1;
15596 VkAttachmentDescription attach_desc = {};
15597 attach_desc.format = VK_FORMAT_UNDEFINED;
15598 rpci.pAttachments = &attach_desc;
15599 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15600 VkRenderPass rp;
15601 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15602
15603 m_errorMonitor->VerifyFound();
15604
15605 if (result == VK_SUCCESS) {
15606 vkDestroyRenderPass(m_device->device(), rp, NULL);
15607 }
15608}
15609
Karl Schultz6addd812016-02-02 17:17:23 -070015610TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015611 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015612
Mike Stroyana3082432015-09-25 13:39:21 -060015613 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015614 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15615 const int32_t tex_width = 32;
15616 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015617
15618 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015619 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15620 image_create_info.pNext = NULL;
15621 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15622 image_create_info.format = tex_format;
15623 image_create_info.extent.width = tex_width;
15624 image_create_info.extent.height = tex_height;
15625 image_create_info.extent.depth = 1;
15626 image_create_info.mipLevels = 1;
15627 image_create_info.arrayLayers = 1;
15628 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15629 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15630 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15631 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015632
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015633 VkImage image;
15634 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015635 ASSERT_VK_SUCCESS(err);
15636
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015637 VkMemoryRequirements requirements;
15638 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15639
15640 VkMemoryAllocateInfo alloc_info{};
15641 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15642 alloc_info.pNext = NULL;
15643 alloc_info.memoryTypeIndex = 0;
15644 alloc_info.allocationSize = requirements.size;
15645 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15646 ASSERT_TRUE(pass);
15647
15648 VkDeviceMemory memory;
15649 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15650 ASSERT_VK_SUCCESS(err);
15651
15652 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15653
Tobin Ehliscde08892015-09-22 10:11:37 -060015654 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015655 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015656 image_view_create_info.image = image;
15657 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15658 image_view_create_info.format = tex_format;
15659 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015660 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015661 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015662 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015663
15664 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015666 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015667 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015668
15669 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015670 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015671}
Mike Stroyana3082432015-09-25 13:39:21 -060015672
Mark Youngd339ba32016-05-30 13:28:35 -060015673TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15674 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015676 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015677
Tony Barbour1fa09702017-03-16 12:09:08 -060015678 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015679
15680 // Create an image and try to create a view with no memory backing the image
15681 VkImage image;
15682
15683 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15684 const int32_t tex_width = 32;
15685 const int32_t tex_height = 32;
15686
15687 VkImageCreateInfo image_create_info = {};
15688 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15689 image_create_info.pNext = NULL;
15690 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15691 image_create_info.format = tex_format;
15692 image_create_info.extent.width = tex_width;
15693 image_create_info.extent.height = tex_height;
15694 image_create_info.extent.depth = 1;
15695 image_create_info.mipLevels = 1;
15696 image_create_info.arrayLayers = 1;
15697 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15698 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15699 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15700 image_create_info.flags = 0;
15701
15702 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15703 ASSERT_VK_SUCCESS(err);
15704
15705 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015706 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015707 image_view_create_info.image = image;
15708 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15709 image_view_create_info.format = tex_format;
15710 image_view_create_info.subresourceRange.layerCount = 1;
15711 image_view_create_info.subresourceRange.baseMipLevel = 0;
15712 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015713 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015714
15715 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015716 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015717
15718 m_errorMonitor->VerifyFound();
15719 vkDestroyImage(m_device->device(), image, NULL);
15720 // If last error is success, it still created the view, so delete it.
15721 if (err == VK_SUCCESS) {
15722 vkDestroyImageView(m_device->device(), view, NULL);
15723 }
Mark Youngd339ba32016-05-30 13:28:35 -060015724}
15725
Karl Schultz6addd812016-02-02 17:17:23 -070015726TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015727 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015729
Tony Barbour1fa09702017-03-16 12:09:08 -060015730 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015731
Karl Schultz6addd812016-02-02 17:17:23 -070015732 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015733 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015734 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015735 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015736
15737 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015738 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015739 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015740 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15741 image_view_create_info.format = tex_format;
15742 image_view_create_info.subresourceRange.baseMipLevel = 0;
15743 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015744 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015745 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015746 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015747
15748 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015749 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015750
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015751 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015752}
15753
Mike Weiblena1e13f42017-02-09 21:25:59 -070015754TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15755 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15756
Tony Barbour1fa09702017-03-16 12:09:08 -060015757 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015758 VkSubresourceLayout subres_layout = {};
15759
15760 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15761 {
15762 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15763 VkImageObj img(m_device);
15764 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15765 ASSERT_TRUE(img.initialized());
15766
15767 VkImageSubresource subres = {};
15768 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15769 subres.mipLevel = 0;
15770 subres.arrayLayer = 0;
15771
15772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15773 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15774 m_errorMonitor->VerifyFound();
15775 }
15776
15777 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15778 {
15779 VkImageObj img(m_device);
15780 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15781 ASSERT_TRUE(img.initialized());
15782
15783 VkImageSubresource subres = {};
15784 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15785 subres.mipLevel = 0;
15786 subres.arrayLayer = 0;
15787
15788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15790 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15791 m_errorMonitor->VerifyFound();
15792 }
15793
15794 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15795 {
15796 VkImageObj img(m_device);
15797 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15798 ASSERT_TRUE(img.initialized());
15799
15800 VkImageSubresource subres = {};
15801 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15802 subres.mipLevel = 1; // ERROR: triggers VU 00739
15803 subres.arrayLayer = 0;
15804
15805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15806 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15807 m_errorMonitor->VerifyFound();
15808 }
15809
15810 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15811 {
15812 VkImageObj img(m_device);
15813 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15814 ASSERT_TRUE(img.initialized());
15815
15816 VkImageSubresource subres = {};
15817 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15818 subres.mipLevel = 0;
15819 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15820
15821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15822 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15823 m_errorMonitor->VerifyFound();
15824 }
15825}
15826
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015827TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015828 VkResult err;
15829 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015830
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015832
Tony Barbour1fa09702017-03-16 12:09:08 -060015833 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015834
15835 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015836 VkImage srcImage;
15837 VkImage dstImage;
15838 VkDeviceMemory srcMem;
15839 VkDeviceMemory destMem;
15840 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015841
15842 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015843 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15844 image_create_info.pNext = NULL;
15845 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15846 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15847 image_create_info.extent.width = 32;
15848 image_create_info.extent.height = 32;
15849 image_create_info.extent.depth = 1;
15850 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015851 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015852 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15853 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15854 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15855 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015856
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015857 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015858 ASSERT_VK_SUCCESS(err);
15859
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015860 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015861 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015862 ASSERT_VK_SUCCESS(err);
15863
15864 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015865 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015866 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15867 memAlloc.pNext = NULL;
15868 memAlloc.allocationSize = 0;
15869 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015870
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015871 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015873 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015874 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015875 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015876 ASSERT_VK_SUCCESS(err);
15877
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015878 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015879 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015880 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015881 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015882 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015883 ASSERT_VK_SUCCESS(err);
15884
15885 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15886 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015887 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015888 ASSERT_VK_SUCCESS(err);
15889
Tony Barbour552f6c02016-12-21 14:34:07 -070015890 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015891 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015892 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015893 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015894 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015895 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015896 copyRegion.srcOffset.x = 0;
15897 copyRegion.srcOffset.y = 0;
15898 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015899 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015900 copyRegion.dstSubresource.mipLevel = 0;
15901 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015902 // Introduce failure by forcing the dst layerCount to differ from src
15903 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015904 copyRegion.dstOffset.x = 0;
15905 copyRegion.dstOffset.y = 0;
15906 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015907 copyRegion.extent.width = 1;
15908 copyRegion.extent.height = 1;
15909 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015910 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015911 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015912
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015913 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015914
Chia-I Wuf7458c52015-10-26 21:10:41 +080015915 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015916 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015917 vkFreeMemory(m_device->device(), srcMem, NULL);
15918 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015919}
15920
Tony Barbourd6673642016-05-05 14:46:39 -060015921TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015922 TEST_DESCRIPTION("Creating images with unsuported formats ");
15923
Tony Barbour1fa09702017-03-16 12:09:08 -060015924 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015926
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015927 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015928 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015929 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15931 image_create_info.format = VK_FORMAT_UNDEFINED;
15932 image_create_info.extent.width = 32;
15933 image_create_info.extent.height = 32;
15934 image_create_info.extent.depth = 1;
15935 image_create_info.mipLevels = 1;
15936 image_create_info.arrayLayers = 1;
15937 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15938 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15939 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15942 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015943
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015944 VkImage image;
15945 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015946 m_errorMonitor->VerifyFound();
15947
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015948 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015949 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015950 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15951 VkFormat format = static_cast<VkFormat>(f);
15952 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015953 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015954 unsupported = format;
15955 break;
15956 }
15957 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015958
Tony Barbourd6673642016-05-05 14:46:39 -060015959 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015960 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015962
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015963 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015964 m_errorMonitor->VerifyFound();
15965 }
15966}
15967
15968TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015969 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15970
Tony Barbour1fa09702017-03-16 12:09:08 -060015971 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060015972 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015973 if (!depth_format) {
15974 return;
15975 }
Tony Barbourd6673642016-05-05 14:46:39 -060015976
15977 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015978 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060015979 VK_IMAGE_TILING_OPTIMAL, 0);
15980 ASSERT_TRUE(image.initialized());
15981
15982 VkImageView imgView;
15983 VkImageViewCreateInfo imgViewInfo = {};
15984 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15985 imgViewInfo.image = image.handle();
15986 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15987 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15988 imgViewInfo.subresourceRange.layerCount = 1;
15989 imgViewInfo.subresourceRange.baseMipLevel = 0;
15990 imgViewInfo.subresourceRange.levelCount = 1;
15991 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15992
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015993 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015994 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015996 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15997 m_errorMonitor->VerifyFound();
15998 imgViewInfo.subresourceRange.baseMipLevel = 0;
15999
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016000 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016001 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016003 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16004 m_errorMonitor->VerifyFound();
16005 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16006
Tony Barbourd6673642016-05-05 14:46:39 -060016007 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16008 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016010 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16011 m_errorMonitor->VerifyFound();
16012 imgViewInfo.subresourceRange.levelCount = 1;
16013
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016014 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16015 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016016 m_errorMonitor->SetDesiredFailureMsg(
16017 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16018 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016019 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16020 m_errorMonitor->VerifyFound();
16021 imgViewInfo.subresourceRange.layerCount = 1;
16022
Tony Barbourd6673642016-05-05 14:46:39 -060016023 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016024 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016025 m_errorMonitor->SetDesiredFailureMsg(
16026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16027 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016028 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16029 m_errorMonitor->VerifyFound();
16030 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16031
Tony Barbourd6673642016-05-05 14:46:39 -060016032 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16033 // VIEW_CREATE_ERROR
16034 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016036 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16037 m_errorMonitor->VerifyFound();
16038 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16039
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016040 // TODO: Update framework to easily passing mutable flag into ImageObj init
16041 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016042 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16043 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16044 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016045 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16046 // VIEW_CREATE_ERROR
16047 VkImageCreateInfo mutImgInfo = image.create_info();
16048 VkImage mutImage;
16049 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016050 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016051 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16052 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016053 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016054 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016055
16056 VkMemoryRequirements requirements;
16057 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16058
16059 VkMemoryAllocateInfo alloc_info{};
16060 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16061 alloc_info.pNext = NULL;
16062 alloc_info.memoryTypeIndex = 0;
16063 alloc_info.allocationSize = requirements.size;
16064 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16065 ASSERT_TRUE(pass);
16066
16067 VkDeviceMemory memory;
16068 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16069 ASSERT_VK_SUCCESS(ret);
16070
16071 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16072 ASSERT_VK_SUCCESS(ret);
16073
Tony Barbourd6673642016-05-05 14:46:39 -060016074 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016076 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16077 m_errorMonitor->VerifyFound();
16078 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016079
16080 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016081 vkDestroyImage(m_device->handle(), mutImage, NULL);
16082}
16083
Dave Houlton75967fc2017-03-06 17:21:16 -070016084TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16085 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16086
Tony Barbour1fa09702017-03-16 12:09:08 -060016087 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016088
Jamie Madill35127872017-03-15 16:17:46 -040016089 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016090 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16091 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16092 if (device_features.textureCompressionBC) {
16093 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16094 } else if (device_features.textureCompressionETC2) {
16095 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16096 } else if (device_features.textureCompressionASTC_LDR) {
16097 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16098 } else {
16099 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16100 return;
16101 }
16102
16103 VkImageCreateInfo ci;
16104 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16105 ci.pNext = NULL;
16106 ci.flags = 0;
16107 ci.imageType = VK_IMAGE_TYPE_2D;
16108 ci.format = compressed_format;
16109 ci.extent = {32, 32, 1};
16110 ci.mipLevels = 6;
16111 ci.arrayLayers = 1;
16112 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16113 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16114 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16115 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16116 ci.queueFamilyIndexCount = 0;
16117 ci.pQueueFamilyIndices = NULL;
16118 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16119
16120 VkImageObj image(m_device);
16121 image.init(&ci);
16122 ASSERT_TRUE(image.initialized());
16123
16124 VkImageObj odd_image(m_device);
16125 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16126 odd_image.init(&ci);
16127 ASSERT_TRUE(odd_image.initialized());
16128
16129 // Allocate buffers
16130 VkMemoryPropertyFlags reqs = 0;
16131 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16132 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16133 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16134 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16135 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16136
16137 VkBufferImageCopy region = {};
16138 region.bufferRowLength = 0;
16139 region.bufferImageHeight = 0;
16140 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16141 region.imageSubresource.layerCount = 1;
16142 region.imageOffset = {0, 0, 0};
16143 region.bufferOffset = 0;
16144
16145 // start recording
16146 m_commandBuffer->BeginCommandBuffer();
16147
16148 // Mip level copies that work - 5 levels
16149 m_errorMonitor->ExpectSuccess();
16150
16151 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16152 region.imageExtent = {32, 32, 1};
16153 region.imageSubresource.mipLevel = 0;
16154 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16155 &region);
16156 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16157 &region);
16158
16159 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16160 region.imageExtent = {8, 8, 1};
16161 region.imageSubresource.mipLevel = 2;
16162 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16163 &region);
16164 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16165 &region);
16166
16167 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16168 region.imageExtent = {4, 4, 1};
16169 region.imageSubresource.mipLevel = 3;
16170 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16171 &region);
16172 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16173 &region);
16174
16175 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16176 region.imageExtent = {2, 2, 1};
16177 region.imageSubresource.mipLevel = 4;
16178 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16179 &region);
16180 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16181 &region);
16182
16183 region.imageExtent = {1, 1, 1};
16184 region.imageSubresource.mipLevel = 5;
16185 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16186 &region);
16187 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16188 &region);
16189 m_errorMonitor->VerifyNotFound();
16190
16191 // Buffer must accomodate a full compressed block, regardless of texel count
16192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16193 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16194 &region);
16195 m_errorMonitor->VerifyFound();
16196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16197 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16198 &region);
16199 m_errorMonitor->VerifyFound();
16200
16201 // Copy width < compressed block size, but not the full mip width
16202 region.imageExtent = {1, 2, 1};
16203 region.imageSubresource.mipLevel = 4;
16204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16205 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16206 &region);
16207 m_errorMonitor->VerifyFound();
16208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16209 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16210 &region);
16211 m_errorMonitor->VerifyFound();
16212
16213 // Copy height < compressed block size but not the full mip height
16214 region.imageExtent = {2, 1, 1};
16215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16216 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16217 &region);
16218 m_errorMonitor->VerifyFound();
16219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16220 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16221 &region);
16222 m_errorMonitor->VerifyFound();
16223
16224 // Offsets must be multiple of compressed block size
16225 region.imageOffset = {1, 1, 0};
16226 region.imageExtent = {1, 1, 1};
16227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16228 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16229 &region);
16230 m_errorMonitor->VerifyFound();
16231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16232 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16233 &region);
16234 m_errorMonitor->VerifyFound();
16235
16236 // Offset + extent width = mip width - should succeed
16237 region.imageOffset = {4, 4, 0};
16238 region.imageExtent = {3, 4, 1};
16239 region.imageSubresource.mipLevel = 2;
16240 m_errorMonitor->ExpectSuccess();
16241 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16242 &region);
16243 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16244 &region);
16245 m_errorMonitor->VerifyNotFound();
16246
16247 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16248 region.imageExtent = {4, 4, 1};
16249 m_errorMonitor->ExpectSuccess();
16250 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16251 &region);
16252 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16253 &region);
16254 m_errorMonitor->VerifyNotFound();
16255
16256 // Offset + extent width < mip width and not a multiple of block width - should fail
16257 region.imageExtent = {3, 3, 1};
16258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16259 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16260 &region);
16261 m_errorMonitor->VerifyFound();
16262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16263 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16264 &region);
16265 m_errorMonitor->VerifyFound();
16266}
16267
Dave Houlton59a20702017-02-02 17:26:23 -070016268TEST_F(VkLayerTest, ImageBufferCopyTests) {
16269 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16270
Tony Barbour1fa09702017-03-16 12:09:08 -060016271 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016272 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16273 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16274 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16275 return;
16276 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016277
16278 // Bail if any dimension of transfer granularity is 0.
16279 auto index = m_device->graphics_queue_node_index_;
16280 auto queue_family_properties = m_device->phy().queue_properties();
16281 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16282 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16283 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16284 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16285 return;
16286 }
16287
Dave Houlton59a20702017-02-02 17:26:23 -070016288 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16289 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16290 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016291 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16292 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16293 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16294 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16295
Dave Houlton59a20702017-02-02 17:26:23 -070016296 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16297 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16298 VK_IMAGE_TILING_OPTIMAL, 0);
16299 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16300 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16301 VK_IMAGE_TILING_OPTIMAL, 0);
16302 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16303 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016304 ASSERT_TRUE(image_64k.initialized());
16305 ASSERT_TRUE(image_16k.initialized());
16306 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016307
Dave Houltonf3229d52017-02-21 15:59:08 -070016308 // Verify all needed Depth/Stencil formats are supported
16309 bool missing_ds_support = false;
16310 VkFormatProperties props = {0, 0, 0};
16311 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16312 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16313 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16314 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16315 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16316 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16317 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16318 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16319
16320 if (!missing_ds_support) {
16321 ds_image_4D_1S.init(
16322 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16323 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16324 VK_IMAGE_TILING_OPTIMAL, 0);
16325 ASSERT_TRUE(ds_image_4D_1S.initialized());
16326
16327 ds_image_3D_1S.init(
16328 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16329 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16330 VK_IMAGE_TILING_OPTIMAL, 0);
16331 ASSERT_TRUE(ds_image_3D_1S.initialized());
16332
16333 ds_image_2D.init(
16334 256, 256, VK_FORMAT_D16_UNORM,
16335 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16336 VK_IMAGE_TILING_OPTIMAL, 0);
16337 ASSERT_TRUE(ds_image_2D.initialized());
16338
16339 ds_image_1S.init(
16340 256, 256, VK_FORMAT_S8_UINT,
16341 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16342 VK_IMAGE_TILING_OPTIMAL, 0);
16343 ASSERT_TRUE(ds_image_1S.initialized());
16344 }
16345
16346 // Allocate buffers
16347 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016348 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016349 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16350 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16351 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16352 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016353
16354 VkBufferImageCopy region = {};
16355 region.bufferRowLength = 0;
16356 region.bufferImageHeight = 0;
16357 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16358 region.imageSubresource.layerCount = 1;
16359 region.imageOffset = {0, 0, 0};
16360 region.imageExtent = {64, 64, 1};
16361 region.bufferOffset = 0;
16362
16363 // attempt copies before putting command buffer in recording state
16364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16365 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16366 &region);
16367 m_errorMonitor->VerifyFound();
16368
16369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16370 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16371 &region);
16372 m_errorMonitor->VerifyFound();
16373
16374 // start recording
16375 m_commandBuffer->BeginCommandBuffer();
16376
16377 // successful copies
16378 m_errorMonitor->ExpectSuccess();
16379 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16380 &region);
16381 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16382 &region);
16383 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16384 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16385 &region);
16386 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16387 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16388 &region);
16389 region.imageOffset.x = 0;
16390 region.imageExtent.height = 64;
16391 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16392 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16393 &region);
16394 m_errorMonitor->VerifyNotFound();
16395
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016396 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016397 region.imageExtent = {65, 64, 1};
16398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16399 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16400 &region);
16401 m_errorMonitor->VerifyFound();
16402
16403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16405 &region);
16406 m_errorMonitor->VerifyFound();
16407
16408 // image/buffer too small (offset) on copy to image
16409 region.imageExtent = {64, 64, 1};
16410 region.imageOffset = {0, 4, 0};
16411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16412 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16413 &region);
16414 m_errorMonitor->VerifyFound();
16415
16416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16417 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16418 &region);
16419 m_errorMonitor->VerifyFound();
16420
16421 // image/buffer too small on copy to buffer
16422 region.imageExtent = {64, 64, 1};
16423 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016424 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429
16430 region.imageExtent = {64, 65, 1};
16431 region.bufferOffset = 0;
16432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16433 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16434 &region);
16435 m_errorMonitor->VerifyFound();
16436
16437 // buffer size ok but rowlength causes loose packing
16438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16439 region.imageExtent = {64, 64, 1};
16440 region.bufferRowLength = 68;
16441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16442 &region);
16443 m_errorMonitor->VerifyFound();
16444
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016445 // An extent with zero area should produce a warning, but no error
16446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16447 region.imageExtent.width = 0;
16448 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16449 &region);
16450 m_errorMonitor->VerifyFound();
16451
Dave Houlton59a20702017-02-02 17:26:23 -070016452 // aspect bits
16453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16454 region.imageExtent = {64, 64, 1};
16455 region.bufferRowLength = 0;
16456 region.bufferImageHeight = 0;
16457 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16458 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16459 buffer_16k.handle(), 1, &region);
16460 m_errorMonitor->VerifyFound();
16461
16462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16463 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16464 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16465 &region);
16466 m_errorMonitor->VerifyFound();
16467
16468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16469 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16470 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16471 buffer_16k.handle(), 1, &region);
16472 m_errorMonitor->VerifyFound();
16473
Dave Houltonf3229d52017-02-21 15:59:08 -070016474 // Test Depth/Stencil copies
16475 if (missing_ds_support) {
16476 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16477 } else {
16478 VkBufferImageCopy ds_region = {};
16479 ds_region.bufferOffset = 0;
16480 ds_region.bufferRowLength = 0;
16481 ds_region.bufferImageHeight = 0;
16482 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16483 ds_region.imageSubresource.mipLevel = 0;
16484 ds_region.imageSubresource.baseArrayLayer = 0;
16485 ds_region.imageSubresource.layerCount = 1;
16486 ds_region.imageOffset = {0, 0, 0};
16487 ds_region.imageExtent = {256, 256, 1};
16488
16489 // Depth copies that should succeed
16490 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16491 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16492 buffer_256k.handle(), 1, &ds_region);
16493 m_errorMonitor->VerifyNotFound();
16494
16495 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16496 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16497 buffer_256k.handle(), 1, &ds_region);
16498 m_errorMonitor->VerifyNotFound();
16499
16500 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16501 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16502 buffer_128k.handle(), 1, &ds_region);
16503 m_errorMonitor->VerifyNotFound();
16504
16505 // Depth copies that should fail
16506 ds_region.bufferOffset = 4;
16507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16508 VALIDATION_ERROR_01246); // 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->VerifyFound();
16512
16513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16514 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16515 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16516 buffer_256k.handle(), 1, &ds_region);
16517 m_errorMonitor->VerifyFound();
16518
16519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16520 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16521 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16522 buffer_128k.handle(), 1, &ds_region);
16523 m_errorMonitor->VerifyFound();
16524
16525 // Stencil copies that should succeed
16526 ds_region.bufferOffset = 0;
16527 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16528 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16529 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16530 buffer_64k.handle(), 1, &ds_region);
16531 m_errorMonitor->VerifyNotFound();
16532
16533 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16534 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16535 buffer_64k.handle(), 1, &ds_region);
16536 m_errorMonitor->VerifyNotFound();
16537
16538 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16539 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16540 buffer_64k.handle(), 1, &ds_region);
16541 m_errorMonitor->VerifyNotFound();
16542
16543 // Stencil copies that should fail
16544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16545 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16546 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16547 buffer_16k.handle(), 1, &ds_region);
16548 m_errorMonitor->VerifyFound();
16549
16550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16551 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16552 ds_region.bufferRowLength = 260;
16553 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16554 buffer_64k.handle(), 1, &ds_region);
16555 m_errorMonitor->VerifyFound();
16556
16557 ds_region.bufferRowLength = 0;
16558 ds_region.bufferOffset = 4;
16559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16560 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16561 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16562 buffer_64k.handle(), 1, &ds_region);
16563 m_errorMonitor->VerifyFound();
16564 }
16565
Dave Houlton584d51e2017-02-16 12:52:54 -070016566 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016567 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016568 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016569 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16570 device_features.textureCompressionASTC_LDR)) {
16571 printf(" No compressed formats supported - block compression tests skipped.\n");
16572 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016573 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16574 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016575 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016576 image_16k_4x4comp.init(128, 128, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016577 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16578 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016579 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016580 image_16k_4x4comp.init(128, 128, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070016581 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016582 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16583 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016584 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016585 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16586 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016587 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16588 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016589 }
16590 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016591
Dave Houlton584d51e2017-02-16 12:52:54 -070016592 // Just fits
16593 m_errorMonitor->ExpectSuccess();
16594 region.imageExtent = {128, 128, 1};
16595 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16596 buffer_16k.handle(), 1, &region);
16597 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016598
Dave Houlton584d51e2017-02-16 12:52:54 -070016599 // with offset, too big for buffer
16600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16601 region.bufferOffset = 16;
16602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16603 buffer_16k.handle(), 1, &region);
16604 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016605 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016606
Dave Houlton67e9b532017-03-02 17:00:10 -070016607 // extents that are not a multiple of compressed block size
16608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16609 region.imageExtent.width = 66;
16610 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16611 buffer_16k.handle(), 1, &region);
16612 m_errorMonitor->VerifyFound();
16613 region.imageExtent.width = 128;
16614
16615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016616 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016617 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16618 buffer_16k.handle(), 1, &region);
16619 m_errorMonitor->VerifyFound();
16620 region.imageExtent.height = 128;
16621
16622 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16623
16624 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16625 m_errorMonitor->ExpectSuccess();
16626 region.imageExtent.width = 66;
16627 region.imageOffset.x = 64;
16628 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16629 buffer_16k.handle(), 1, &region);
16630 region.imageExtent.width = 16;
16631 region.imageOffset.x = 0;
16632 region.imageExtent.height = 2;
16633 region.imageOffset.y = 128;
16634 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016635 buffer_16k.handle(), 1, &region);
16636 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016637 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016638
Dave Houlton584d51e2017-02-16 12:52:54 -070016639 // buffer offset must be a multiple of texel block size (16)
16640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16642 region.imageExtent = {64, 64, 1};
16643 region.bufferOffset = 24;
16644 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16645 buffer_16k.handle(), 1, &region);
16646 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016647
Dave Houlton584d51e2017-02-16 12:52:54 -070016648 // rowlength not a multiple of block width (4)
16649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16650 region.bufferOffset = 0;
16651 region.bufferRowLength = 130;
16652 region.bufferImageHeight = 0;
16653 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16654 buffer_64k.handle(), 1, &region);
16655 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016656
Dave Houlton584d51e2017-02-16 12:52:54 -070016657 // imageheight not a multiple of block height (4)
16658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16659 region.bufferRowLength = 0;
16660 region.bufferImageHeight = 130;
16661 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16662 buffer_64k.handle(), 1, &region);
16663 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016664 }
Dave Houlton59a20702017-02-02 17:26:23 -070016665}
16666
Tony Barbourd6673642016-05-05 14:46:39 -060016667TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016668 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016669
Tony Barbour1fa09702017-03-16 12:09:08 -060016670 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016671
Rene Lindsay135204f2016-12-22 17:11:09 -070016672 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016673 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016674 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016675 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016676 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016677 vk_testing::Buffer buffer;
16678 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016679 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016680 VkBufferImageCopy region = {};
16681 region.bufferRowLength = 128;
16682 region.bufferImageHeight = 128;
16683 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16684 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016685 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016686 region.imageExtent.height = 4;
16687 region.imageExtent.width = 4;
16688 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016689
16690 VkImageObj image2(m_device);
16691 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016692 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016693 ASSERT_TRUE(image2.initialized());
16694 vk_testing::Buffer buffer2;
16695 VkMemoryPropertyFlags reqs2 = 0;
16696 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16697 VkBufferImageCopy region2 = {};
16698 region2.bufferRowLength = 128;
16699 region2.bufferImageHeight = 128;
16700 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16701 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16702 region2.imageSubresource.layerCount = 1;
16703 region2.imageExtent.height = 4;
16704 region2.imageExtent.width = 4;
16705 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016706 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016707
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016708 // Image must have offset.z of 0 and extent.depth of 1
16709 // Introduce failure by setting imageExtent.depth to 0
16710 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016712 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016713 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016714 m_errorMonitor->VerifyFound();
16715
16716 region.imageExtent.depth = 1;
16717
16718 // Image must have offset.z of 0 and extent.depth of 1
16719 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016720 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016721 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016724 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016725 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016726 m_errorMonitor->VerifyFound();
16727
16728 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016729 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16730 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016731 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016733 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16734 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016735 m_errorMonitor->VerifyFound();
16736
16737 // BufferOffset must be a multiple of 4
16738 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016739 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016741 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16742 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016743 m_errorMonitor->VerifyFound();
16744
16745 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16746 region.bufferOffset = 0;
16747 region.imageExtent.height = 128;
16748 region.imageExtent.width = 128;
16749 // Introduce failure by setting bufferRowLength > 0 but less than width
16750 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
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 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16757 region.bufferRowLength = 128;
16758 // Introduce failure by setting bufferRowHeight > 0 but less than height
16759 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016761 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16762 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016763 m_errorMonitor->VerifyFound();
16764
16765 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016766 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016767 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16768 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016769 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016770 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16771 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016772 VkImageBlit blitRegion = {};
16773 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16774 blitRegion.srcSubresource.baseArrayLayer = 0;
16775 blitRegion.srcSubresource.layerCount = 1;
16776 blitRegion.srcSubresource.mipLevel = 0;
16777 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16778 blitRegion.dstSubresource.baseArrayLayer = 0;
16779 blitRegion.dstSubresource.layerCount = 1;
16780 blitRegion.dstSubresource.mipLevel = 0;
16781
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016782 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16784 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16786 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016787 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16788 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016789 m_errorMonitor->VerifyFound();
16790
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016792 VkImageMemoryBarrier img_barrier;
16793 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16794 img_barrier.pNext = NULL;
16795 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16796 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16797 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16798 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16799 img_barrier.image = image.handle();
16800 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16801 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16802 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16803 img_barrier.subresourceRange.baseArrayLayer = 0;
16804 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016805 img_barrier.subresourceRange.layerCount = 0;
16806 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016807 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16808 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016809 m_errorMonitor->VerifyFound();
16810 img_barrier.subresourceRange.layerCount = 1;
16811}
16812
16813TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016814 TEST_DESCRIPTION("Exceed the limits of image format ");
16815
Tony Barbour1fa09702017-03-16 12:09:08 -060016816 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016817
16818 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16819 {
16820 VkFormatProperties properties;
16821 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16822 if (properties.linearTilingFeatures == 0) {
16823 printf(" Image format not supported; skipped.\n");
16824 return;
16825 }
16826 }
16827
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016829 VkImageCreateInfo image_create_info = {};
16830 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16831 image_create_info.pNext = NULL;
16832 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016833 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016834 image_create_info.extent.width = 32;
16835 image_create_info.extent.height = 32;
16836 image_create_info.extent.depth = 1;
16837 image_create_info.mipLevels = 1;
16838 image_create_info.arrayLayers = 1;
16839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16840 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16841 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16842 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16843 image_create_info.flags = 0;
16844
16845 VkImage nullImg;
16846 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016847 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16848 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016849 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016850 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16851 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16852 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016853 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016854
Tony Barbour0907e362017-03-09 15:05:30 -070016855 uint32_t maxDim =
16856 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16857 // If max mip levels exceeds image extents, skip the max mip levels test
16858 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16860 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16861 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16862 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16863 m_errorMonitor->VerifyFound();
16864 image_create_info.mipLevels = 1;
16865 }
Tony Barbourd6673642016-05-05 14:46:39 -060016866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016868 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16869 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16870 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16871 m_errorMonitor->VerifyFound();
16872 image_create_info.arrayLayers = 1;
16873
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016875 int samples = imgFmtProps.sampleCounts >> 1;
16876 image_create_info.samples = (VkSampleCountFlagBits)samples;
16877 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16878 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16879 m_errorMonitor->VerifyFound();
16880 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16881
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16883 "pCreateInfo->initialLayout, must be "
16884 "VK_IMAGE_LAYOUT_UNDEFINED or "
16885 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016886 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16887 // Expect INVALID_LAYOUT
16888 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16889 m_errorMonitor->VerifyFound();
16890 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16891}
16892
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016893TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016894 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016896
Tony Barbour1fa09702017-03-16 12:09:08 -060016897 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016898
16899 VkImageObj src_image(m_device);
16900 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16901 VkImageObj dst_image(m_device);
16902 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16903
Tony Barbour552f6c02016-12-21 14:34:07 -070016904 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016905 VkImageCopy copy_region;
16906 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16907 copy_region.srcSubresource.mipLevel = 0;
16908 copy_region.srcSubresource.baseArrayLayer = 0;
16909 copy_region.srcSubresource.layerCount = 0;
16910 copy_region.srcOffset.x = 0;
16911 copy_region.srcOffset.y = 0;
16912 copy_region.srcOffset.z = 0;
16913 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16914 copy_region.dstSubresource.mipLevel = 0;
16915 copy_region.dstSubresource.baseArrayLayer = 0;
16916 copy_region.dstSubresource.layerCount = 0;
16917 copy_region.dstOffset.x = 0;
16918 copy_region.dstOffset.y = 0;
16919 copy_region.dstOffset.z = 0;
16920 copy_region.extent.width = 64;
16921 copy_region.extent.height = 64;
16922 copy_region.extent.depth = 1;
16923 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16924 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016925 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016926
16927 m_errorMonitor->VerifyFound();
16928}
16929
16930TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016931 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016933
Tony Barbour1fa09702017-03-16 12:09:08 -060016934 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016935
16936 VkImageObj src_image(m_device);
16937 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16938 VkImageObj dst_image(m_device);
16939 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16940
Tony Barbour552f6c02016-12-21 14:34:07 -070016941 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016942 VkImageCopy copy_region;
16943 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16944 copy_region.srcSubresource.mipLevel = 0;
16945 copy_region.srcSubresource.baseArrayLayer = 0;
16946 copy_region.srcSubresource.layerCount = 0;
16947 copy_region.srcOffset.x = 0;
16948 copy_region.srcOffset.y = 0;
16949 copy_region.srcOffset.z = 0;
16950 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16951 copy_region.dstSubresource.mipLevel = 0;
16952 copy_region.dstSubresource.baseArrayLayer = 0;
16953 copy_region.dstSubresource.layerCount = 0;
16954 copy_region.dstOffset.x = 0;
16955 copy_region.dstOffset.y = 0;
16956 copy_region.dstOffset.z = 0;
16957 copy_region.extent.width = 64;
16958 copy_region.extent.height = 64;
16959 copy_region.extent.depth = 1;
16960 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16961 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016962 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016963
16964 m_errorMonitor->VerifyFound();
16965}
16966
Karl Schultz6addd812016-02-02 17:17:23 -070016967TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016968 VkResult err;
16969 bool pass;
16970
16971 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016973
Tony Barbour1fa09702017-03-16 12:09:08 -060016974 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016975
16976 // Create two images of different types and try to copy between them
16977 VkImage srcImage;
16978 VkImage dstImage;
16979 VkDeviceMemory srcMem;
16980 VkDeviceMemory destMem;
16981 VkMemoryRequirements memReqs;
16982
16983 VkImageCreateInfo image_create_info = {};
16984 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16985 image_create_info.pNext = NULL;
16986 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16987 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16988 image_create_info.extent.width = 32;
16989 image_create_info.extent.height = 32;
16990 image_create_info.extent.depth = 1;
16991 image_create_info.mipLevels = 1;
16992 image_create_info.arrayLayers = 1;
16993 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16994 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16995 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16996 image_create_info.flags = 0;
16997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016998 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016999 ASSERT_VK_SUCCESS(err);
17000
17001 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17002 // Introduce failure by creating second image with a different-sized format.
17003 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17004
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017005 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017006 ASSERT_VK_SUCCESS(err);
17007
17008 // Allocate memory
17009 VkMemoryAllocateInfo memAlloc = {};
17010 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17011 memAlloc.pNext = NULL;
17012 memAlloc.allocationSize = 0;
17013 memAlloc.memoryTypeIndex = 0;
17014
17015 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17016 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017017 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017018 ASSERT_TRUE(pass);
17019 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17020 ASSERT_VK_SUCCESS(err);
17021
17022 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17023 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017024 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017025 ASSERT_TRUE(pass);
17026 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17027 ASSERT_VK_SUCCESS(err);
17028
17029 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17030 ASSERT_VK_SUCCESS(err);
17031 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17032 ASSERT_VK_SUCCESS(err);
17033
Tony Barbour552f6c02016-12-21 14:34:07 -070017034 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017035 VkImageCopy copyRegion;
17036 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17037 copyRegion.srcSubresource.mipLevel = 0;
17038 copyRegion.srcSubresource.baseArrayLayer = 0;
17039 copyRegion.srcSubresource.layerCount = 0;
17040 copyRegion.srcOffset.x = 0;
17041 copyRegion.srcOffset.y = 0;
17042 copyRegion.srcOffset.z = 0;
17043 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17044 copyRegion.dstSubresource.mipLevel = 0;
17045 copyRegion.dstSubresource.baseArrayLayer = 0;
17046 copyRegion.dstSubresource.layerCount = 0;
17047 copyRegion.dstOffset.x = 0;
17048 copyRegion.dstOffset.y = 0;
17049 copyRegion.dstOffset.z = 0;
17050 copyRegion.extent.width = 1;
17051 copyRegion.extent.height = 1;
17052 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017053 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017054 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017055
17056 m_errorMonitor->VerifyFound();
17057
17058 vkDestroyImage(m_device->device(), srcImage, NULL);
17059 vkDestroyImage(m_device->device(), dstImage, NULL);
17060 vkFreeMemory(m_device->device(), srcMem, NULL);
17061 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017062}
17063
Karl Schultz6addd812016-02-02 17:17:23 -070017064TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17065 VkResult err;
17066 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017067
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017068 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17070 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017071
Tony Barbour1fa09702017-03-16 12:09:08 -060017072 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017073 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017074 if (!depth_format) {
17075 return;
17076 }
Mike Stroyana3082432015-09-25 13:39:21 -060017077
17078 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017079 VkImage srcImage;
17080 VkImage dstImage;
17081 VkDeviceMemory srcMem;
17082 VkDeviceMemory destMem;
17083 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017084
17085 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017086 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17087 image_create_info.pNext = NULL;
17088 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017089 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017090 image_create_info.extent.width = 32;
17091 image_create_info.extent.height = 32;
17092 image_create_info.extent.depth = 1;
17093 image_create_info.mipLevels = 1;
17094 image_create_info.arrayLayers = 1;
17095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17096 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17097 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17098 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017100 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017101 ASSERT_VK_SUCCESS(err);
17102
Karl Schultzbdb75952016-04-19 11:36:49 -060017103 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17104
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017105 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017106 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017107 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017108 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017110 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017111 ASSERT_VK_SUCCESS(err);
17112
17113 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017114 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017115 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17116 memAlloc.pNext = NULL;
17117 memAlloc.allocationSize = 0;
17118 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017119
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017120 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017122 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017123 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017124 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017125 ASSERT_VK_SUCCESS(err);
17126
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017127 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017128 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017129 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017130 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017131 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017132 ASSERT_VK_SUCCESS(err);
17133
17134 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17135 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017136 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017137 ASSERT_VK_SUCCESS(err);
17138
Tony Barbour552f6c02016-12-21 14:34:07 -070017139 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017140 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017141 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017142 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017143 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017144 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017145 copyRegion.srcOffset.x = 0;
17146 copyRegion.srcOffset.y = 0;
17147 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017148 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017149 copyRegion.dstSubresource.mipLevel = 0;
17150 copyRegion.dstSubresource.baseArrayLayer = 0;
17151 copyRegion.dstSubresource.layerCount = 0;
17152 copyRegion.dstOffset.x = 0;
17153 copyRegion.dstOffset.y = 0;
17154 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017155 copyRegion.extent.width = 1;
17156 copyRegion.extent.height = 1;
17157 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017158 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017159 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017160
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017161 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017162
Chia-I Wuf7458c52015-10-26 21:10:41 +080017163 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017164 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017165 vkFreeMemory(m_device->device(), srcMem, NULL);
17166 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017167}
17168
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017169TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17170 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017171
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017172 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017173
17174 VkImageFormatProperties image_format_properties;
17175 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17176 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17177 &image_format_properties);
17178
17179 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17180 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17181 printf(" Image multi-sample support not found; skipped.\n");
17182 return;
17183 }
17184
17185 VkImageCreateInfo ci;
17186 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17187 ci.pNext = NULL;
17188 ci.flags = 0;
17189 ci.imageType = VK_IMAGE_TYPE_2D;
17190 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17191 ci.extent = {128, 128, 1};
17192 ci.mipLevels = 1;
17193 ci.arrayLayers = 1;
17194 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17195 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17196 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17197 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17198 ci.queueFamilyIndexCount = 0;
17199 ci.pQueueFamilyIndices = NULL;
17200 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17201
17202 VkImageObj image1(m_device);
17203 image1.init(&ci);
17204 ASSERT_TRUE(image1.initialized());
17205
17206 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17207 VkImageObj image2(m_device);
17208 image2.init(&ci);
17209 ASSERT_TRUE(image2.initialized());
17210
17211 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17212 VkImageObj image4(m_device);
17213 image4.init(&ci);
17214 ASSERT_TRUE(image4.initialized());
17215
17216 m_commandBuffer->BeginCommandBuffer();
17217
17218 VkImageCopy copyRegion;
17219 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17220 copyRegion.srcSubresource.mipLevel = 0;
17221 copyRegion.srcSubresource.baseArrayLayer = 0;
17222 copyRegion.srcSubresource.layerCount = 1;
17223 copyRegion.srcOffset = {0, 0, 0};
17224 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17225 copyRegion.dstSubresource.mipLevel = 0;
17226 copyRegion.dstSubresource.baseArrayLayer = 0;
17227 copyRegion.dstSubresource.layerCount = 1;
17228 copyRegion.dstOffset = {0, 0, 0};
17229 copyRegion.extent = {128, 128, 1};
17230
17231 // Copy a single sample image to/from a multi-sample image
17232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17233 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17234 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17235 m_errorMonitor->VerifyFound();
17236
17237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17238 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17239 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17240 m_errorMonitor->VerifyFound();
17241
17242 // Copy between multi-sample images with different sample counts
17243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17244 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17245 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17246 m_errorMonitor->VerifyFound();
17247
17248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17249 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17250 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17251 m_errorMonitor->VerifyFound();
17252
17253 m_commandBuffer->EndCommandBuffer();
17254}
17255
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017256TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17257 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017258 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017259 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017260 if (!ds_format) {
17261 return;
17262 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017263
17264 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17265 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17266 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Tony Barbour9357d542017-03-24 15:42:21 -060017267 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17268 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017269 ASSERT_TRUE(color_image.initialized());
17270 ASSERT_TRUE(depth_image.initialized());
17271 ASSERT_TRUE(ds_image.initialized());
17272
17273 VkImageCopy copyRegion;
17274 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17275 copyRegion.srcSubresource.mipLevel = 0;
17276 copyRegion.srcSubresource.baseArrayLayer = 0;
17277 copyRegion.srcSubresource.layerCount = 1;
17278 copyRegion.srcOffset = {0, 0, 0};
17279 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17280 copyRegion.dstSubresource.mipLevel = 0;
17281 copyRegion.dstSubresource.baseArrayLayer = 0;
17282 copyRegion.dstSubresource.layerCount = 1;
17283 copyRegion.dstOffset = {64, 0, 0};
17284 copyRegion.extent = {64, 128, 1};
17285
17286 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17288 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17289 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17290 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017291 m_errorMonitor->VerifyFound();
17292
17293 m_commandBuffer->BeginCommandBuffer();
17294
17295 // Src and dest aspect masks don't match
17296 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017298 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17299 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017300 m_errorMonitor->VerifyFound();
17301 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17302
17303 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017304 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017305 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17307 // These aspect/format mismatches are redundant but unavoidable here
17308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017310 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17311 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017312 m_errorMonitor->VerifyFound();
17313 // Metadata aspect is illegal - VU 01222
17314 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17315 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17317 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017318 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17319 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017320 m_errorMonitor->VerifyFound();
17321
17322 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17323 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17324
17325 // Aspect mask doesn't match source image format - VU 01200
17326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17327 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17329 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17330 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17331 m_errorMonitor->VerifyFound();
17332
17333 // Aspect mask doesn't match dest image format - VU 01201
17334 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17335 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17337 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17339 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17340 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17341 m_errorMonitor->VerifyFound();
17342
17343 m_commandBuffer->EndCommandBuffer();
17344}
17345
Karl Schultz6addd812016-02-02 17:17:23 -070017346TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17347 VkResult err;
17348 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17351 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017352
Tony Barbour1fa09702017-03-16 12:09:08 -060017353 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017354
17355 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017356 VkImage srcImage;
17357 VkImage dstImage;
17358 VkDeviceMemory srcMem;
17359 VkDeviceMemory destMem;
17360 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017361
17362 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017363 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17364 image_create_info.pNext = NULL;
17365 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17366 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17367 image_create_info.extent.width = 32;
17368 image_create_info.extent.height = 1;
17369 image_create_info.extent.depth = 1;
17370 image_create_info.mipLevels = 1;
17371 image_create_info.arrayLayers = 1;
17372 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17373 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17374 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17375 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017376
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017377 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017378 ASSERT_VK_SUCCESS(err);
17379
Karl Schultz6addd812016-02-02 17:17:23 -070017380 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017381
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017383 ASSERT_VK_SUCCESS(err);
17384
17385 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017386 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017387 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17388 memAlloc.pNext = NULL;
17389 memAlloc.allocationSize = 0;
17390 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017391
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017392 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017393 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017394 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017395 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017396 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017397 ASSERT_VK_SUCCESS(err);
17398
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017399 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017400 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017401 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017402 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017403 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017404 ASSERT_VK_SUCCESS(err);
17405
17406 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17407 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017408 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017409 ASSERT_VK_SUCCESS(err);
17410
Tony Barbour552f6c02016-12-21 14:34:07 -070017411 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017412 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017413 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17414 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017415 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017416 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017417 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017418 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017419 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017420 resolveRegion.srcOffset.x = 0;
17421 resolveRegion.srcOffset.y = 0;
17422 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017423 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017424 resolveRegion.dstSubresource.mipLevel = 0;
17425 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017426 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017427 resolveRegion.dstOffset.x = 0;
17428 resolveRegion.dstOffset.y = 0;
17429 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017430 resolveRegion.extent.width = 1;
17431 resolveRegion.extent.height = 1;
17432 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017433 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017434 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017435
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017436 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017437
Chia-I Wuf7458c52015-10-26 21:10:41 +080017438 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017439 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017440 vkFreeMemory(m_device->device(), srcMem, NULL);
17441 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017442}
17443
Karl Schultz6addd812016-02-02 17:17:23 -070017444TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17445 VkResult err;
17446 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17449 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017450
Tony Barbour1fa09702017-03-16 12:09:08 -060017451 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017452
Chris Forbesa7530692016-05-08 12:35:39 +120017453 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017454 VkImage srcImage;
17455 VkImage dstImage;
17456 VkDeviceMemory srcMem;
17457 VkDeviceMemory destMem;
17458 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017459
17460 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017461 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17462 image_create_info.pNext = NULL;
17463 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17464 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17465 image_create_info.extent.width = 32;
17466 image_create_info.extent.height = 1;
17467 image_create_info.extent.depth = 1;
17468 image_create_info.mipLevels = 1;
17469 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017470 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017471 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17472 // Note: Some implementations expect color attachment usage for any
17473 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017474 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017475 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017476
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017477 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017478 ASSERT_VK_SUCCESS(err);
17479
Karl Schultz6addd812016-02-02 17:17:23 -070017480 // Note: Some implementations expect color attachment usage for any
17481 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017482 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017483
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017484 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017485 ASSERT_VK_SUCCESS(err);
17486
17487 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017488 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017489 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17490 memAlloc.pNext = NULL;
17491 memAlloc.allocationSize = 0;
17492 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017493
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017494 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017495 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017496 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017497 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017498 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017499 ASSERT_VK_SUCCESS(err);
17500
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017501 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017502 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017503 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017504 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017505 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017506 ASSERT_VK_SUCCESS(err);
17507
17508 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17509 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017510 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017511 ASSERT_VK_SUCCESS(err);
17512
Tony Barbour552f6c02016-12-21 14:34:07 -070017513 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017514 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017515 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17516 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017517 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017518 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017519 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017520 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017521 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017522 resolveRegion.srcOffset.x = 0;
17523 resolveRegion.srcOffset.y = 0;
17524 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017525 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017526 resolveRegion.dstSubresource.mipLevel = 0;
17527 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017528 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017529 resolveRegion.dstOffset.x = 0;
17530 resolveRegion.dstOffset.y = 0;
17531 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017532 resolveRegion.extent.width = 1;
17533 resolveRegion.extent.height = 1;
17534 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017535 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017536 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017538 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017539
Chia-I Wuf7458c52015-10-26 21:10:41 +080017540 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017541 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017542 vkFreeMemory(m_device->device(), srcMem, NULL);
17543 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017544}
17545
Karl Schultz6addd812016-02-02 17:17:23 -070017546TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17547 VkResult err;
17548 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017549
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017551 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017552
Tony Barbour1fa09702017-03-16 12:09:08 -060017553 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017554
17555 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017556 VkImage srcImage;
17557 VkImage dstImage;
17558 VkDeviceMemory srcMem;
17559 VkDeviceMemory destMem;
17560 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017561
17562 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017563 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17564 image_create_info.pNext = NULL;
17565 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17566 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17567 image_create_info.extent.width = 32;
17568 image_create_info.extent.height = 1;
17569 image_create_info.extent.depth = 1;
17570 image_create_info.mipLevels = 1;
17571 image_create_info.arrayLayers = 1;
17572 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17573 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17574 // Note: Some implementations expect color attachment usage for any
17575 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017576 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017577 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017578
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017579 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017580 ASSERT_VK_SUCCESS(err);
17581
Karl Schultz6addd812016-02-02 17:17:23 -070017582 // Set format to something other than source image
17583 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17584 // Note: Some implementations expect color attachment usage for any
17585 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017586 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017588
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017589 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017590 ASSERT_VK_SUCCESS(err);
17591
17592 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017593 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017594 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17595 memAlloc.pNext = NULL;
17596 memAlloc.allocationSize = 0;
17597 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017598
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017599 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017600 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017601 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017602 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017603 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017604 ASSERT_VK_SUCCESS(err);
17605
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017606 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017607 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017608 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017609 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017610 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017611 ASSERT_VK_SUCCESS(err);
17612
17613 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17614 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017615 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017616 ASSERT_VK_SUCCESS(err);
17617
Tony Barbour552f6c02016-12-21 14:34:07 -070017618 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017619 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017620 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17621 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017622 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017623 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017624 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017625 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017626 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017627 resolveRegion.srcOffset.x = 0;
17628 resolveRegion.srcOffset.y = 0;
17629 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017630 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017631 resolveRegion.dstSubresource.mipLevel = 0;
17632 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017633 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017634 resolveRegion.dstOffset.x = 0;
17635 resolveRegion.dstOffset.y = 0;
17636 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017637 resolveRegion.extent.width = 1;
17638 resolveRegion.extent.height = 1;
17639 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017640 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017641 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017642
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017643 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017644
Chia-I Wuf7458c52015-10-26 21:10:41 +080017645 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017646 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017647 vkFreeMemory(m_device->device(), srcMem, NULL);
17648 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017649}
17650
Karl Schultz6addd812016-02-02 17:17:23 -070017651TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17652 VkResult err;
17653 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017654
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017656 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017657
Tony Barbour1fa09702017-03-16 12:09:08 -060017658 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017659
17660 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017661 VkImage srcImage;
17662 VkImage dstImage;
17663 VkDeviceMemory srcMem;
17664 VkDeviceMemory destMem;
17665 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017666
17667 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017668 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17669 image_create_info.pNext = NULL;
17670 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17671 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17672 image_create_info.extent.width = 32;
17673 image_create_info.extent.height = 1;
17674 image_create_info.extent.depth = 1;
17675 image_create_info.mipLevels = 1;
17676 image_create_info.arrayLayers = 1;
17677 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17678 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17679 // Note: Some implementations expect color attachment usage for any
17680 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017681 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017682 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017683
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017684 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017685 ASSERT_VK_SUCCESS(err);
17686
Karl Schultz6addd812016-02-02 17:17:23 -070017687 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17688 // Note: Some implementations expect color attachment usage for any
17689 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017690 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017691 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017693 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017694 ASSERT_VK_SUCCESS(err);
17695
17696 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017697 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017698 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17699 memAlloc.pNext = NULL;
17700 memAlloc.allocationSize = 0;
17701 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017702
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017703 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017704 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017705 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017706 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017707 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017708 ASSERT_VK_SUCCESS(err);
17709
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017710 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017711 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017712 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017713 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017714 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017715 ASSERT_VK_SUCCESS(err);
17716
17717 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17718 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017719 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017720 ASSERT_VK_SUCCESS(err);
17721
Tony Barbour552f6c02016-12-21 14:34:07 -070017722 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017723 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017724 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17725 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017726 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017727 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017728 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017729 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017730 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017731 resolveRegion.srcOffset.x = 0;
17732 resolveRegion.srcOffset.y = 0;
17733 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017734 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017735 resolveRegion.dstSubresource.mipLevel = 0;
17736 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017737 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017738 resolveRegion.dstOffset.x = 0;
17739 resolveRegion.dstOffset.y = 0;
17740 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017741 resolveRegion.extent.width = 1;
17742 resolveRegion.extent.height = 1;
17743 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017744 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017745 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017747 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017748
Chia-I Wuf7458c52015-10-26 21:10:41 +080017749 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017750 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017751 vkFreeMemory(m_device->device(), srcMem, NULL);
17752 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017753}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017754
Karl Schultz6addd812016-02-02 17:17:23 -070017755TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017756 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017757 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17758 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017759 // The image format check comes 2nd in validation so we trigger it first,
17760 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017761 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017762
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17764 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017765
Tony Barbour1fa09702017-03-16 12:09:08 -060017766 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017767 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017768 if (!depth_format) {
17769 return;
17770 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017771
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017772 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017773 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17774 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017775
17776 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017777 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17778 ds_pool_ci.pNext = NULL;
17779 ds_pool_ci.maxSets = 1;
17780 ds_pool_ci.poolSizeCount = 1;
17781 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017782
17783 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017784 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017785 ASSERT_VK_SUCCESS(err);
17786
17787 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017788 dsl_binding.binding = 0;
17789 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17790 dsl_binding.descriptorCount = 1;
17791 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17792 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017793
17794 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017795 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17796 ds_layout_ci.pNext = NULL;
17797 ds_layout_ci.bindingCount = 1;
17798 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017799 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017800 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017801 ASSERT_VK_SUCCESS(err);
17802
17803 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017804 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017805 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017806 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017807 alloc_info.descriptorPool = ds_pool;
17808 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017809 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017810 ASSERT_VK_SUCCESS(err);
17811
Karl Schultz6addd812016-02-02 17:17:23 -070017812 VkImage image_bad;
17813 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017814 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017815 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017816 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017817 const int32_t tex_width = 32;
17818 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819
17820 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17822 image_create_info.pNext = NULL;
17823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17824 image_create_info.format = tex_format_bad;
17825 image_create_info.extent.width = tex_width;
17826 image_create_info.extent.height = tex_height;
17827 image_create_info.extent.depth = 1;
17828 image_create_info.mipLevels = 1;
17829 image_create_info.arrayLayers = 1;
17830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17831 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017833 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017834
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017835 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017836 ASSERT_VK_SUCCESS(err);
17837 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017838 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17839 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017840 ASSERT_VK_SUCCESS(err);
17841
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017842 // ---Bind image memory---
17843 VkMemoryRequirements img_mem_reqs;
17844 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17845 VkMemoryAllocateInfo image_alloc_info = {};
17846 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17847 image_alloc_info.pNext = NULL;
17848 image_alloc_info.memoryTypeIndex = 0;
17849 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017850 bool pass =
17851 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 -070017852 ASSERT_TRUE(pass);
17853 VkDeviceMemory mem;
17854 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17855 ASSERT_VK_SUCCESS(err);
17856 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17857 ASSERT_VK_SUCCESS(err);
17858 // -----------------------
17859
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017860 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017861 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017862 image_view_create_info.image = image_bad;
17863 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17864 image_view_create_info.format = tex_format_bad;
17865 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17866 image_view_create_info.subresourceRange.baseMipLevel = 0;
17867 image_view_create_info.subresourceRange.layerCount = 1;
17868 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017869 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017870
17871 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017872 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017873
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017874 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017875
Chia-I Wuf7458c52015-10-26 21:10:41 +080017876 vkDestroyImage(m_device->device(), image_bad, NULL);
17877 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017878 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17879 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017880
17881 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017882}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017883
17884TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017885 TEST_DESCRIPTION(
17886 "Call ClearColorImage w/ a depth|stencil image and "
17887 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017888
Tony Barbour1fa09702017-03-16 12:09:08 -060017889 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017890 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017891 if (!depth_format) {
17892 return;
17893 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17895
Tony Barbour552f6c02016-12-21 14:34:07 -070017896 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017897
17898 // Color image
17899 VkClearColorValue clear_color;
17900 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17901 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17902 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17903 const int32_t img_width = 32;
17904 const int32_t img_height = 32;
17905 VkImageCreateInfo image_create_info = {};
17906 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17907 image_create_info.pNext = NULL;
17908 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17909 image_create_info.format = color_format;
17910 image_create_info.extent.width = img_width;
17911 image_create_info.extent.height = img_height;
17912 image_create_info.extent.depth = 1;
17913 image_create_info.mipLevels = 1;
17914 image_create_info.arrayLayers = 1;
17915 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17916 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17917 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17918
17919 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017920 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017921
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017922 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017923
17924 // Depth/Stencil image
17925 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017926 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017927 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17928 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017929 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017930 ds_image_create_info.extent.width = 64;
17931 ds_image_create_info.extent.height = 64;
17932 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017933 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 -060017934
17935 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017936 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017938 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 -060017939
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017942 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017943 &color_range);
17944
17945 m_errorMonitor->VerifyFound();
17946
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17948 "vkCmdClearColorImage called with "
17949 "image created without "
17950 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017951
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017952 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017953 &color_range);
17954
17955 m_errorMonitor->VerifyFound();
17956
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017957 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17959 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017960
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017961 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17962 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017963
17964 m_errorMonitor->VerifyFound();
17965}
Tobin Ehliscde08892015-09-22 10:11:37 -060017966
Mike Schuchardt35fece12017-03-07 14:40:28 -070017967TEST_F(VkLayerTest, CommandQueueFlags) {
17968 TEST_DESCRIPTION(
17969 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17970 "graphics-only command");
17971
17972 ASSERT_NO_FATAL_FAILURE(Init());
17973
17974 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017975 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070017976 printf(" Non-graphics queue family not found; skipped.\n");
17977 return;
17978 } else {
17979 // Create command pool on a non-graphics queue
17980 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17981
17982 // Setup command buffer on pool
17983 VkCommandBufferObj command_buffer(m_device, &command_pool);
17984 command_buffer.BeginCommandBuffer();
17985
17986 // Issue a graphics only command
17987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17988 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17989 command_buffer.SetViewport(0, 1, &viewport);
17990 m_errorMonitor->VerifyFound();
17991 }
17992}
17993
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017994// WSI Enabled Tests
17995//
Chris Forbes09368e42016-10-13 11:59:22 +130017996#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017997TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17998
17999#if defined(VK_USE_PLATFORM_XCB_KHR)
18000 VkSurfaceKHR surface = VK_NULL_HANDLE;
18001
18002 VkResult err;
18003 bool pass;
18004 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18005 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18006 // uint32_t swapchain_image_count = 0;
18007 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18008 // uint32_t image_index = 0;
18009 // VkPresentInfoKHR present_info = {};
18010
Tony Barbour1fa09702017-03-16 12:09:08 -060018011 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018012
18013 // Use the create function from one of the VK_KHR_*_surface extension in
18014 // order to create a surface, testing all known errors in the process,
18015 // before successfully creating a surface:
18016 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18018 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18019 pass = (err != VK_SUCCESS);
18020 ASSERT_TRUE(pass);
18021 m_errorMonitor->VerifyFound();
18022
18023 // Next, try to create a surface with the wrong
18024 // VkXcbSurfaceCreateInfoKHR::sType:
18025 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18026 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18028 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18029 pass = (err != VK_SUCCESS);
18030 ASSERT_TRUE(pass);
18031 m_errorMonitor->VerifyFound();
18032
18033 // Create a native window, and then correctly create a surface:
18034 xcb_connection_t *connection;
18035 xcb_screen_t *screen;
18036 xcb_window_t xcb_window;
18037 xcb_intern_atom_reply_t *atom_wm_delete_window;
18038
18039 const xcb_setup_t *setup;
18040 xcb_screen_iterator_t iter;
18041 int scr;
18042 uint32_t value_mask, value_list[32];
18043 int width = 1;
18044 int height = 1;
18045
18046 connection = xcb_connect(NULL, &scr);
18047 ASSERT_TRUE(connection != NULL);
18048 setup = xcb_get_setup(connection);
18049 iter = xcb_setup_roots_iterator(setup);
18050 while (scr-- > 0)
18051 xcb_screen_next(&iter);
18052 screen = iter.data;
18053
18054 xcb_window = xcb_generate_id(connection);
18055
18056 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18057 value_list[0] = screen->black_pixel;
18058 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18059
18060 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18061 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18062
18063 /* Magic code that will send notification when window is destroyed */
18064 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18065 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18066
18067 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18068 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18069 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18070 free(reply);
18071
18072 xcb_map_window(connection, xcb_window);
18073
18074 // Force the x/y coordinates to 100,100 results are identical in consecutive
18075 // runs
18076 const uint32_t coords[] = { 100, 100 };
18077 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18078
18079 // Finally, try to correctly create a surface:
18080 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18081 xcb_create_info.pNext = NULL;
18082 xcb_create_info.flags = 0;
18083 xcb_create_info.connection = connection;
18084 xcb_create_info.window = xcb_window;
18085 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18086 pass = (err == VK_SUCCESS);
18087 ASSERT_TRUE(pass);
18088
18089 // Check if surface supports presentation:
18090
18091 // 1st, do so without having queried the queue families:
18092 VkBool32 supported = false;
18093 // TODO: Get the following error to come out:
18094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18095 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18096 "function");
18097 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18098 pass = (err != VK_SUCCESS);
18099 // ASSERT_TRUE(pass);
18100 // m_errorMonitor->VerifyFound();
18101
18102 // Next, query a queue family index that's too large:
18103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18104 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18105 pass = (err != VK_SUCCESS);
18106 ASSERT_TRUE(pass);
18107 m_errorMonitor->VerifyFound();
18108
18109 // Finally, do so correctly:
18110 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18111 // SUPPORTED
18112 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18113 pass = (err == VK_SUCCESS);
18114 ASSERT_TRUE(pass);
18115
18116 // Before proceeding, try to create a swapchain without having called
18117 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18118 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18119 swapchain_create_info.pNext = NULL;
18120 swapchain_create_info.flags = 0;
18121 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18122 swapchain_create_info.surface = surface;
18123 swapchain_create_info.imageArrayLayers = 1;
18124 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18125 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18127 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18128 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18129 pass = (err != VK_SUCCESS);
18130 ASSERT_TRUE(pass);
18131 m_errorMonitor->VerifyFound();
18132
18133 // Get the surface capabilities:
18134 VkSurfaceCapabilitiesKHR surface_capabilities;
18135
18136 // Do so correctly (only error logged by this entrypoint is if the
18137 // extension isn't enabled):
18138 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18139 pass = (err == VK_SUCCESS);
18140 ASSERT_TRUE(pass);
18141
18142 // Get the surface formats:
18143 uint32_t surface_format_count;
18144
18145 // First, try without a pointer to surface_format_count:
18146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18147 "specified as NULL");
18148 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18149 pass = (err == VK_SUCCESS);
18150 ASSERT_TRUE(pass);
18151 m_errorMonitor->VerifyFound();
18152
18153 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18154 // correctly done a 1st try (to get the count):
18155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18156 surface_format_count = 0;
18157 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18158 pass = (err == VK_SUCCESS);
18159 ASSERT_TRUE(pass);
18160 m_errorMonitor->VerifyFound();
18161
18162 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18163 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18164 pass = (err == VK_SUCCESS);
18165 ASSERT_TRUE(pass);
18166
18167 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18168 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18169
18170 // Next, do a 2nd try with surface_format_count being set too high:
18171 surface_format_count += 5;
18172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18173 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18174 pass = (err == VK_SUCCESS);
18175 ASSERT_TRUE(pass);
18176 m_errorMonitor->VerifyFound();
18177
18178 // Finally, do a correct 1st and 2nd try:
18179 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18180 pass = (err == VK_SUCCESS);
18181 ASSERT_TRUE(pass);
18182 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18183 pass = (err == VK_SUCCESS);
18184 ASSERT_TRUE(pass);
18185
18186 // Get the surface present modes:
18187 uint32_t surface_present_mode_count;
18188
18189 // First, try without a pointer to surface_format_count:
18190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18191 "specified as NULL");
18192
18193 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18194 pass = (err == VK_SUCCESS);
18195 ASSERT_TRUE(pass);
18196 m_errorMonitor->VerifyFound();
18197
18198 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18199 // correctly done a 1st try (to get the count):
18200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18201 surface_present_mode_count = 0;
18202 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18203 (VkPresentModeKHR *)&surface_present_mode_count);
18204 pass = (err == VK_SUCCESS);
18205 ASSERT_TRUE(pass);
18206 m_errorMonitor->VerifyFound();
18207
18208 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18209 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18210 pass = (err == VK_SUCCESS);
18211 ASSERT_TRUE(pass);
18212
18213 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18214 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18215
18216 // Next, do a 2nd try with surface_format_count being set too high:
18217 surface_present_mode_count += 5;
18218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18219 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18220 pass = (err == VK_SUCCESS);
18221 ASSERT_TRUE(pass);
18222 m_errorMonitor->VerifyFound();
18223
18224 // Finally, do a correct 1st and 2nd try:
18225 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18226 pass = (err == VK_SUCCESS);
18227 ASSERT_TRUE(pass);
18228 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18229 pass = (err == VK_SUCCESS);
18230 ASSERT_TRUE(pass);
18231
18232 // Create a swapchain:
18233
18234 // First, try without a pointer to swapchain_create_info:
18235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18236 "specified as NULL");
18237
18238 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18239 pass = (err != VK_SUCCESS);
18240 ASSERT_TRUE(pass);
18241 m_errorMonitor->VerifyFound();
18242
18243 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18244 // sType:
18245 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18247
18248 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18249 pass = (err != VK_SUCCESS);
18250 ASSERT_TRUE(pass);
18251 m_errorMonitor->VerifyFound();
18252
18253 // Next, call with a NULL swapchain pointer:
18254 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18255 swapchain_create_info.pNext = NULL;
18256 swapchain_create_info.flags = 0;
18257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18258 "specified as NULL");
18259
18260 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18261 pass = (err != VK_SUCCESS);
18262 ASSERT_TRUE(pass);
18263 m_errorMonitor->VerifyFound();
18264
18265 // TODO: Enhance swapchain layer so that
18266 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18267
18268 // Next, call with a queue family index that's too large:
18269 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18270 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18271 swapchain_create_info.queueFamilyIndexCount = 2;
18272 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18274 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18275 pass = (err != VK_SUCCESS);
18276 ASSERT_TRUE(pass);
18277 m_errorMonitor->VerifyFound();
18278
18279 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18280 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18281 swapchain_create_info.queueFamilyIndexCount = 1;
18282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18283 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18284 "pCreateInfo->pQueueFamilyIndices).");
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 an invalid imageSharingMode:
18291 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18292 swapchain_create_info.queueFamilyIndexCount = 1;
18293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18294 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18295 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18296 pass = (err != VK_SUCCESS);
18297 ASSERT_TRUE(pass);
18298 m_errorMonitor->VerifyFound();
18299 // Fix for the future:
18300 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18301 // SUPPORTED
18302 swapchain_create_info.queueFamilyIndexCount = 0;
18303 queueFamilyIndex[0] = 0;
18304 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18305
18306 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18307 // Get the images from a swapchain:
18308 // Acquire an image from a swapchain:
18309 // Present an image to a swapchain:
18310 // Destroy the swapchain:
18311
18312 // TODOs:
18313 //
18314 // - Try destroying the device without first destroying the swapchain
18315 //
18316 // - Try destroying the device without first destroying the surface
18317 //
18318 // - Try destroying the surface without first destroying the swapchain
18319
18320 // Destroy the surface:
18321 vkDestroySurfaceKHR(instance(), surface, NULL);
18322
18323 // Tear down the window:
18324 xcb_destroy_window(connection, xcb_window);
18325 xcb_disconnect(connection);
18326
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018327#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018328 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018329#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018330}
Chris Forbes09368e42016-10-13 11:59:22 +130018331#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018332
18333//
18334// POSITIVE VALIDATION TESTS
18335//
18336// These tests do not expect to encounter ANY validation errors pass only if this is true
18337
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018338TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18339 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18342
18343 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18344 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018345 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018346 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18347 command_buffer_allocate_info.commandBufferCount = 1;
18348
18349 VkCommandBuffer secondary_command_buffer;
18350 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18351 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18352 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18353 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18354 command_buffer_inheritance_info.renderPass = m_renderPass;
18355 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18356
18357 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18358 command_buffer_begin_info.flags =
18359 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18360 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18361
18362 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18363 VkClearAttachment color_attachment;
18364 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18365 color_attachment.clearValue.color.float32[0] = 0;
18366 color_attachment.clearValue.color.float32[1] = 0;
18367 color_attachment.clearValue.color.float32[2] = 0;
18368 color_attachment.clearValue.color.float32[3] = 0;
18369 color_attachment.colorAttachment = 0;
18370 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18371 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18372}
18373
Tobin Ehlise0006882016-11-03 10:14:28 -060018374TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018375 TEST_DESCRIPTION(
18376 "Perform an image layout transition in a secondary command buffer followed "
18377 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018378 VkResult err;
18379 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018380 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018381 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018382 if (!depth_format) {
18383 return;
18384 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18386 // Allocate a secondary and primary cmd buffer
18387 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18388 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018389 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018390 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18391 command_buffer_allocate_info.commandBufferCount = 1;
18392
18393 VkCommandBuffer secondary_command_buffer;
18394 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18395 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18396 VkCommandBuffer primary_command_buffer;
18397 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18398 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18399 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18400 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18401 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18402 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18403 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18404
18405 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18406 ASSERT_VK_SUCCESS(err);
18407 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018408 image.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlise0006882016-11-03 10:14:28 -060018409 ASSERT_TRUE(image.initialized());
18410 VkImageMemoryBarrier img_barrier = {};
18411 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18412 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18413 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18414 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18415 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18416 img_barrier.image = image.handle();
18417 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18418 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18419 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18420 img_barrier.subresourceRange.baseArrayLayer = 0;
18421 img_barrier.subresourceRange.baseMipLevel = 0;
18422 img_barrier.subresourceRange.layerCount = 1;
18423 img_barrier.subresourceRange.levelCount = 1;
18424 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18425 0, nullptr, 1, &img_barrier);
18426 err = vkEndCommandBuffer(secondary_command_buffer);
18427 ASSERT_VK_SUCCESS(err);
18428
18429 // Now update primary cmd buffer to execute secondary and transitions image
18430 command_buffer_begin_info.pInheritanceInfo = nullptr;
18431 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18432 ASSERT_VK_SUCCESS(err);
18433 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18434 VkImageMemoryBarrier img_barrier2 = {};
18435 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18436 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18437 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18438 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18439 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18440 img_barrier2.image = image.handle();
18441 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18442 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18443 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18444 img_barrier2.subresourceRange.baseArrayLayer = 0;
18445 img_barrier2.subresourceRange.baseMipLevel = 0;
18446 img_barrier2.subresourceRange.layerCount = 1;
18447 img_barrier2.subresourceRange.levelCount = 1;
18448 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18449 nullptr, 1, &img_barrier2);
18450 err = vkEndCommandBuffer(primary_command_buffer);
18451 ASSERT_VK_SUCCESS(err);
18452 VkSubmitInfo submit_info = {};
18453 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18454 submit_info.commandBufferCount = 1;
18455 submit_info.pCommandBuffers = &primary_command_buffer;
18456 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18457 ASSERT_VK_SUCCESS(err);
18458 m_errorMonitor->VerifyNotFound();
18459 err = vkDeviceWaitIdle(m_device->device());
18460 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018461 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18462 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018463}
18464
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018465// This is a positive test. No failures are expected.
18466TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018467 TEST_DESCRIPTION(
18468 "Ensure that the vkUpdateDescriptorSets validation code "
18469 "is ignoring VkWriteDescriptorSet members that are not "
18470 "related to the descriptor type specified by "
18471 "VkWriteDescriptorSet::descriptorType. Correct "
18472 "validation behavior will result in the test running to "
18473 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018474
18475 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18476
Tony Barbour1fa09702017-03-16 12:09:08 -060018477 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018478
18479 // Image Case
18480 {
18481 m_errorMonitor->ExpectSuccess();
18482
18483 VkImage image;
18484 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18485 const int32_t tex_width = 32;
18486 const int32_t tex_height = 32;
18487 VkImageCreateInfo image_create_info = {};
18488 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18489 image_create_info.pNext = NULL;
18490 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18491 image_create_info.format = tex_format;
18492 image_create_info.extent.width = tex_width;
18493 image_create_info.extent.height = tex_height;
18494 image_create_info.extent.depth = 1;
18495 image_create_info.mipLevels = 1;
18496 image_create_info.arrayLayers = 1;
18497 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18498 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18499 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18500 image_create_info.flags = 0;
18501 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18502 ASSERT_VK_SUCCESS(err);
18503
18504 VkMemoryRequirements memory_reqs;
18505 VkDeviceMemory image_memory;
18506 bool pass;
18507 VkMemoryAllocateInfo memory_info = {};
18508 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18509 memory_info.pNext = NULL;
18510 memory_info.allocationSize = 0;
18511 memory_info.memoryTypeIndex = 0;
18512 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18513 memory_info.allocationSize = memory_reqs.size;
18514 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18515 ASSERT_TRUE(pass);
18516 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18517 ASSERT_VK_SUCCESS(err);
18518 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18519 ASSERT_VK_SUCCESS(err);
18520
18521 VkImageViewCreateInfo image_view_create_info = {};
18522 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18523 image_view_create_info.image = image;
18524 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18525 image_view_create_info.format = tex_format;
18526 image_view_create_info.subresourceRange.layerCount = 1;
18527 image_view_create_info.subresourceRange.baseMipLevel = 0;
18528 image_view_create_info.subresourceRange.levelCount = 1;
18529 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18530
18531 VkImageView view;
18532 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18533 ASSERT_VK_SUCCESS(err);
18534
18535 VkDescriptorPoolSize ds_type_count = {};
18536 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18537 ds_type_count.descriptorCount = 1;
18538
18539 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18540 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18541 ds_pool_ci.pNext = NULL;
18542 ds_pool_ci.maxSets = 1;
18543 ds_pool_ci.poolSizeCount = 1;
18544 ds_pool_ci.pPoolSizes = &ds_type_count;
18545
18546 VkDescriptorPool ds_pool;
18547 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18548 ASSERT_VK_SUCCESS(err);
18549
18550 VkDescriptorSetLayoutBinding dsl_binding = {};
18551 dsl_binding.binding = 0;
18552 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18553 dsl_binding.descriptorCount = 1;
18554 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18555 dsl_binding.pImmutableSamplers = NULL;
18556
18557 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18558 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18559 ds_layout_ci.pNext = NULL;
18560 ds_layout_ci.bindingCount = 1;
18561 ds_layout_ci.pBindings = &dsl_binding;
18562 VkDescriptorSetLayout ds_layout;
18563 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18564 ASSERT_VK_SUCCESS(err);
18565
18566 VkDescriptorSet descriptor_set;
18567 VkDescriptorSetAllocateInfo alloc_info = {};
18568 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18569 alloc_info.descriptorSetCount = 1;
18570 alloc_info.descriptorPool = ds_pool;
18571 alloc_info.pSetLayouts = &ds_layout;
18572 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18573 ASSERT_VK_SUCCESS(err);
18574
18575 VkDescriptorImageInfo image_info = {};
18576 image_info.imageView = view;
18577 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18578
18579 VkWriteDescriptorSet descriptor_write;
18580 memset(&descriptor_write, 0, sizeof(descriptor_write));
18581 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18582 descriptor_write.dstSet = descriptor_set;
18583 descriptor_write.dstBinding = 0;
18584 descriptor_write.descriptorCount = 1;
18585 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18586 descriptor_write.pImageInfo = &image_info;
18587
18588 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18589 // be
18590 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18591 // This will most likely produce a crash if the parameter_validation
18592 // layer
18593 // does not correctly ignore pBufferInfo.
18594 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18595 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18596
18597 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18598
18599 m_errorMonitor->VerifyNotFound();
18600
18601 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18602 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18603 vkDestroyImageView(m_device->device(), view, NULL);
18604 vkDestroyImage(m_device->device(), image, NULL);
18605 vkFreeMemory(m_device->device(), image_memory, NULL);
18606 }
18607
18608 // Buffer Case
18609 {
18610 m_errorMonitor->ExpectSuccess();
18611
18612 VkBuffer buffer;
18613 uint32_t queue_family_index = 0;
18614 VkBufferCreateInfo buffer_create_info = {};
18615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18616 buffer_create_info.size = 1024;
18617 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18618 buffer_create_info.queueFamilyIndexCount = 1;
18619 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18620
18621 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18622 ASSERT_VK_SUCCESS(err);
18623
18624 VkMemoryRequirements memory_reqs;
18625 VkDeviceMemory buffer_memory;
18626 bool pass;
18627 VkMemoryAllocateInfo memory_info = {};
18628 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18629 memory_info.pNext = NULL;
18630 memory_info.allocationSize = 0;
18631 memory_info.memoryTypeIndex = 0;
18632
18633 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18634 memory_info.allocationSize = memory_reqs.size;
18635 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18636 ASSERT_TRUE(pass);
18637
18638 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18639 ASSERT_VK_SUCCESS(err);
18640 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18641 ASSERT_VK_SUCCESS(err);
18642
18643 VkDescriptorPoolSize ds_type_count = {};
18644 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18645 ds_type_count.descriptorCount = 1;
18646
18647 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18648 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18649 ds_pool_ci.pNext = NULL;
18650 ds_pool_ci.maxSets = 1;
18651 ds_pool_ci.poolSizeCount = 1;
18652 ds_pool_ci.pPoolSizes = &ds_type_count;
18653
18654 VkDescriptorPool ds_pool;
18655 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18656 ASSERT_VK_SUCCESS(err);
18657
18658 VkDescriptorSetLayoutBinding dsl_binding = {};
18659 dsl_binding.binding = 0;
18660 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18661 dsl_binding.descriptorCount = 1;
18662 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18663 dsl_binding.pImmutableSamplers = NULL;
18664
18665 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18666 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18667 ds_layout_ci.pNext = NULL;
18668 ds_layout_ci.bindingCount = 1;
18669 ds_layout_ci.pBindings = &dsl_binding;
18670 VkDescriptorSetLayout ds_layout;
18671 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18672 ASSERT_VK_SUCCESS(err);
18673
18674 VkDescriptorSet descriptor_set;
18675 VkDescriptorSetAllocateInfo alloc_info = {};
18676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18677 alloc_info.descriptorSetCount = 1;
18678 alloc_info.descriptorPool = ds_pool;
18679 alloc_info.pSetLayouts = &ds_layout;
18680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18681 ASSERT_VK_SUCCESS(err);
18682
18683 VkDescriptorBufferInfo buffer_info = {};
18684 buffer_info.buffer = buffer;
18685 buffer_info.offset = 0;
18686 buffer_info.range = 1024;
18687
18688 VkWriteDescriptorSet descriptor_write;
18689 memset(&descriptor_write, 0, sizeof(descriptor_write));
18690 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18691 descriptor_write.dstSet = descriptor_set;
18692 descriptor_write.dstBinding = 0;
18693 descriptor_write.descriptorCount = 1;
18694 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18695 descriptor_write.pBufferInfo = &buffer_info;
18696
18697 // Set pImageInfo and pTexelBufferView to invalid values, which should
18698 // be
18699 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18700 // This will most likely produce a crash if the parameter_validation
18701 // layer
18702 // does not correctly ignore pImageInfo.
18703 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18704 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18705
18706 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18707
18708 m_errorMonitor->VerifyNotFound();
18709
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18711 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18712 vkDestroyBuffer(m_device->device(), buffer, NULL);
18713 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18714 }
18715
18716 // Texel Buffer Case
18717 {
18718 m_errorMonitor->ExpectSuccess();
18719
18720 VkBuffer buffer;
18721 uint32_t queue_family_index = 0;
18722 VkBufferCreateInfo buffer_create_info = {};
18723 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18724 buffer_create_info.size = 1024;
18725 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18726 buffer_create_info.queueFamilyIndexCount = 1;
18727 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18728
18729 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18730 ASSERT_VK_SUCCESS(err);
18731
18732 VkMemoryRequirements memory_reqs;
18733 VkDeviceMemory buffer_memory;
18734 bool pass;
18735 VkMemoryAllocateInfo memory_info = {};
18736 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18737 memory_info.pNext = NULL;
18738 memory_info.allocationSize = 0;
18739 memory_info.memoryTypeIndex = 0;
18740
18741 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18742 memory_info.allocationSize = memory_reqs.size;
18743 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18744 ASSERT_TRUE(pass);
18745
18746 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18747 ASSERT_VK_SUCCESS(err);
18748 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18749 ASSERT_VK_SUCCESS(err);
18750
18751 VkBufferViewCreateInfo buff_view_ci = {};
18752 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18753 buff_view_ci.buffer = buffer;
18754 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18755 buff_view_ci.range = VK_WHOLE_SIZE;
18756 VkBufferView buffer_view;
18757 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18758
18759 VkDescriptorPoolSize ds_type_count = {};
18760 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18761 ds_type_count.descriptorCount = 1;
18762
18763 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18764 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18765 ds_pool_ci.pNext = NULL;
18766 ds_pool_ci.maxSets = 1;
18767 ds_pool_ci.poolSizeCount = 1;
18768 ds_pool_ci.pPoolSizes = &ds_type_count;
18769
18770 VkDescriptorPool ds_pool;
18771 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18772 ASSERT_VK_SUCCESS(err);
18773
18774 VkDescriptorSetLayoutBinding dsl_binding = {};
18775 dsl_binding.binding = 0;
18776 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18777 dsl_binding.descriptorCount = 1;
18778 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18779 dsl_binding.pImmutableSamplers = NULL;
18780
18781 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18782 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18783 ds_layout_ci.pNext = NULL;
18784 ds_layout_ci.bindingCount = 1;
18785 ds_layout_ci.pBindings = &dsl_binding;
18786 VkDescriptorSetLayout ds_layout;
18787 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18788 ASSERT_VK_SUCCESS(err);
18789
18790 VkDescriptorSet descriptor_set;
18791 VkDescriptorSetAllocateInfo alloc_info = {};
18792 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18793 alloc_info.descriptorSetCount = 1;
18794 alloc_info.descriptorPool = ds_pool;
18795 alloc_info.pSetLayouts = &ds_layout;
18796 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18797 ASSERT_VK_SUCCESS(err);
18798
18799 VkWriteDescriptorSet descriptor_write;
18800 memset(&descriptor_write, 0, sizeof(descriptor_write));
18801 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18802 descriptor_write.dstSet = descriptor_set;
18803 descriptor_write.dstBinding = 0;
18804 descriptor_write.descriptorCount = 1;
18805 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18806 descriptor_write.pTexelBufferView = &buffer_view;
18807
18808 // Set pImageInfo and pBufferInfo to invalid values, which should be
18809 // ignored for descriptorType ==
18810 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18811 // This will most likely produce a crash if the parameter_validation
18812 // layer
18813 // does not correctly ignore pImageInfo and pBufferInfo.
18814 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18815 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18816
18817 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18818
18819 m_errorMonitor->VerifyNotFound();
18820
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018821 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18822 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18823 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18824 vkDestroyBuffer(m_device->device(), buffer, NULL);
18825 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18826 }
18827}
18828
Tobin Ehlisf7428442016-10-25 07:58:24 -060018829TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18830 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18831
Tony Barbour1fa09702017-03-16 12:09:08 -060018832 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018833 // Create layout where two binding #s are "1"
18834 static const uint32_t NUM_BINDINGS = 3;
18835 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18836 dsl_binding[0].binding = 1;
18837 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18838 dsl_binding[0].descriptorCount = 1;
18839 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18840 dsl_binding[0].pImmutableSamplers = NULL;
18841 dsl_binding[1].binding = 0;
18842 dsl_binding[1].descriptorCount = 1;
18843 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18844 dsl_binding[1].descriptorCount = 1;
18845 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18846 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018847 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018848 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18849 dsl_binding[2].descriptorCount = 1;
18850 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18851 dsl_binding[2].pImmutableSamplers = NULL;
18852
18853 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18854 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18855 ds_layout_ci.pNext = NULL;
18856 ds_layout_ci.bindingCount = NUM_BINDINGS;
18857 ds_layout_ci.pBindings = dsl_binding;
18858 VkDescriptorSetLayout ds_layout;
18859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18860 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18861 m_errorMonitor->VerifyFound();
18862}
18863
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018864TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018865 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18866
Tony Barbour1fa09702017-03-16 12:09:08 -060018867 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018868
Tony Barbour552f6c02016-12-21 14:34:07 -070018869 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018870
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018871 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18872
18873 {
18874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18875 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18876 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18877 m_errorMonitor->VerifyFound();
18878 }
18879
18880 {
18881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18882 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18883 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18884 m_errorMonitor->VerifyFound();
18885 }
18886
18887 {
18888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18889 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18890 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18891 m_errorMonitor->VerifyFound();
18892 }
18893
18894 {
18895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18896 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18897 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18898 m_errorMonitor->VerifyFound();
18899 }
18900
18901 {
18902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18903 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18904 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18905 m_errorMonitor->VerifyFound();
18906 }
18907
18908 {
18909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18910 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18911 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18912 m_errorMonitor->VerifyFound();
18913 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018914
18915 {
18916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18917 VkRect2D scissor = {{-1, 0}, {16, 16}};
18918 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18919 m_errorMonitor->VerifyFound();
18920 }
18921
18922 {
18923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18924 VkRect2D scissor = {{0, -2}, {16, 16}};
18925 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18926 m_errorMonitor->VerifyFound();
18927 }
18928
18929 {
18930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18931 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18932 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18933 m_errorMonitor->VerifyFound();
18934 }
18935
18936 {
18937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18938 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18939 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18940 m_errorMonitor->VerifyFound();
18941 }
18942
Tony Barbour552f6c02016-12-21 14:34:07 -070018943 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018944}
18945
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018946// This is a positive test. No failures are expected.
18947TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18948 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18949 VkResult err;
18950
Tony Barbour1fa09702017-03-16 12:09:08 -060018951 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018952 m_errorMonitor->ExpectSuccess();
18953 VkDescriptorPoolSize ds_type_count = {};
18954 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18955 ds_type_count.descriptorCount = 2;
18956
18957 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18958 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18959 ds_pool_ci.pNext = NULL;
18960 ds_pool_ci.maxSets = 1;
18961 ds_pool_ci.poolSizeCount = 1;
18962 ds_pool_ci.pPoolSizes = &ds_type_count;
18963
18964 VkDescriptorPool ds_pool;
18965 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18966 ASSERT_VK_SUCCESS(err);
18967
18968 // Create layout with two uniform buffer descriptors w/ empty binding between them
18969 static const uint32_t NUM_BINDINGS = 3;
18970 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18971 dsl_binding[0].binding = 0;
18972 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18973 dsl_binding[0].descriptorCount = 1;
18974 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18975 dsl_binding[0].pImmutableSamplers = NULL;
18976 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018977 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018978 dsl_binding[2].binding = 2;
18979 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18980 dsl_binding[2].descriptorCount = 1;
18981 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18982 dsl_binding[2].pImmutableSamplers = NULL;
18983
18984 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18985 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18986 ds_layout_ci.pNext = NULL;
18987 ds_layout_ci.bindingCount = NUM_BINDINGS;
18988 ds_layout_ci.pBindings = dsl_binding;
18989 VkDescriptorSetLayout ds_layout;
18990 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18991 ASSERT_VK_SUCCESS(err);
18992
18993 VkDescriptorSet descriptor_set = {};
18994 VkDescriptorSetAllocateInfo alloc_info = {};
18995 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18996 alloc_info.descriptorSetCount = 1;
18997 alloc_info.descriptorPool = ds_pool;
18998 alloc_info.pSetLayouts = &ds_layout;
18999 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19000 ASSERT_VK_SUCCESS(err);
19001
19002 // Create a buffer to be used for update
19003 VkBufferCreateInfo buff_ci = {};
19004 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19005 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19006 buff_ci.size = 256;
19007 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19008 VkBuffer buffer;
19009 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19010 ASSERT_VK_SUCCESS(err);
19011 // Have to bind memory to buffer before descriptor update
19012 VkMemoryAllocateInfo mem_alloc = {};
19013 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19014 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019015 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019016 mem_alloc.memoryTypeIndex = 0;
19017
19018 VkMemoryRequirements mem_reqs;
19019 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19020 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19021 if (!pass) {
19022 vkDestroyBuffer(m_device->device(), buffer, NULL);
19023 return;
19024 }
19025
19026 VkDeviceMemory mem;
19027 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19028 ASSERT_VK_SUCCESS(err);
19029 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19030 ASSERT_VK_SUCCESS(err);
19031
19032 // Only update the descriptor at binding 2
19033 VkDescriptorBufferInfo buff_info = {};
19034 buff_info.buffer = buffer;
19035 buff_info.offset = 0;
19036 buff_info.range = VK_WHOLE_SIZE;
19037 VkWriteDescriptorSet descriptor_write = {};
19038 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19039 descriptor_write.dstBinding = 2;
19040 descriptor_write.descriptorCount = 1;
19041 descriptor_write.pTexelBufferView = nullptr;
19042 descriptor_write.pBufferInfo = &buff_info;
19043 descriptor_write.pImageInfo = nullptr;
19044 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19045 descriptor_write.dstSet = descriptor_set;
19046
19047 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19048
19049 m_errorMonitor->VerifyNotFound();
19050 // Cleanup
19051 vkFreeMemory(m_device->device(), mem, NULL);
19052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19053 vkDestroyBuffer(m_device->device(), buffer, NULL);
19054 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19055}
19056
19057// This is a positive test. No failures are expected.
19058TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19059 VkResult err;
19060 bool pass;
19061
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019062 TEST_DESCRIPTION(
19063 "Create a buffer, allocate memory, bind memory, destroy "
19064 "the buffer, create an image, and bind the same memory to "
19065 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019066
19067 m_errorMonitor->ExpectSuccess();
19068
Tony Barbour1fa09702017-03-16 12:09:08 -060019069 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019070
19071 VkBuffer buffer;
19072 VkImage image;
19073 VkDeviceMemory mem;
19074 VkMemoryRequirements mem_reqs;
19075
19076 VkBufferCreateInfo buf_info = {};
19077 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19078 buf_info.pNext = NULL;
19079 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19080 buf_info.size = 256;
19081 buf_info.queueFamilyIndexCount = 0;
19082 buf_info.pQueueFamilyIndices = NULL;
19083 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19084 buf_info.flags = 0;
19085 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19086 ASSERT_VK_SUCCESS(err);
19087
19088 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19089
19090 VkMemoryAllocateInfo alloc_info = {};
19091 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19092 alloc_info.pNext = NULL;
19093 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019094
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019095 // Ensure memory is big enough for both bindings
19096 alloc_info.allocationSize = 0x10000;
19097
19098 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19099 if (!pass) {
19100 vkDestroyBuffer(m_device->device(), buffer, NULL);
19101 return;
19102 }
19103
19104 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19105 ASSERT_VK_SUCCESS(err);
19106
19107 uint8_t *pData;
19108 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19109 ASSERT_VK_SUCCESS(err);
19110
19111 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19112
19113 vkUnmapMemory(m_device->device(), mem);
19114
19115 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19116 ASSERT_VK_SUCCESS(err);
19117
19118 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19119 // memory. In fact, it was never used by the GPU.
19120 // Just be be sure, wait for idle.
19121 vkDestroyBuffer(m_device->device(), buffer, NULL);
19122 vkDeviceWaitIdle(m_device->device());
19123
Tobin Ehlis6a005702016-12-28 15:25:56 -070019124 // Use optimal as some platforms report linear support but then fail image creation
19125 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19126 VkImageFormatProperties image_format_properties;
19127 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19128 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19129 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019130 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019131 vkFreeMemory(m_device->device(), mem, NULL);
19132 return;
19133 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019134 VkImageCreateInfo image_create_info = {};
19135 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19136 image_create_info.pNext = NULL;
19137 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19138 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19139 image_create_info.extent.width = 64;
19140 image_create_info.extent.height = 64;
19141 image_create_info.extent.depth = 1;
19142 image_create_info.mipLevels = 1;
19143 image_create_info.arrayLayers = 1;
19144 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019145 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019146 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19147 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19148 image_create_info.queueFamilyIndexCount = 0;
19149 image_create_info.pQueueFamilyIndices = NULL;
19150 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19151 image_create_info.flags = 0;
19152
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019153 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019154 * to be textures or it will be the staging image if they are not.
19155 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019156 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19157 ASSERT_VK_SUCCESS(err);
19158
19159 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19160
Tobin Ehlis6a005702016-12-28 15:25:56 -070019161 VkMemoryAllocateInfo mem_alloc = {};
19162 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19163 mem_alloc.pNext = NULL;
19164 mem_alloc.allocationSize = 0;
19165 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019166 mem_alloc.allocationSize = mem_reqs.size;
19167
19168 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19169 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019170 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019171 vkDestroyImage(m_device->device(), image, NULL);
19172 return;
19173 }
19174
19175 // VALIDATION FAILURE:
19176 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19177 ASSERT_VK_SUCCESS(err);
19178
19179 m_errorMonitor->VerifyNotFound();
19180
19181 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019182 vkDestroyImage(m_device->device(), image, NULL);
19183}
19184
Tony Barbourab713912017-02-02 14:17:35 -070019185// This is a positive test. No failures are expected.
19186TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19187 VkResult err;
19188
19189 TEST_DESCRIPTION(
19190 "Call all applicable destroy and free routines with NULL"
19191 "handles, expecting no validation errors");
19192
19193 m_errorMonitor->ExpectSuccess();
19194
Tony Barbour1fa09702017-03-16 12:09:08 -060019195 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019196 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19199 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19201 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19202 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19203 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19204 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19205 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19206 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19207 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19208 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19209 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19210 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19211 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19212 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19213 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19214 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19215 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19216
19217 VkCommandPool command_pool;
19218 VkCommandPoolCreateInfo pool_create_info{};
19219 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19220 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19221 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19222 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19223 VkCommandBuffer command_buffers[3] = {};
19224 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19225 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19226 command_buffer_allocate_info.commandPool = command_pool;
19227 command_buffer_allocate_info.commandBufferCount = 1;
19228 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19229 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19230 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19231 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19232
19233 VkDescriptorPoolSize ds_type_count = {};
19234 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19235 ds_type_count.descriptorCount = 1;
19236
19237 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19238 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19239 ds_pool_ci.pNext = NULL;
19240 ds_pool_ci.maxSets = 1;
19241 ds_pool_ci.poolSizeCount = 1;
19242 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19243 ds_pool_ci.pPoolSizes = &ds_type_count;
19244
19245 VkDescriptorPool ds_pool;
19246 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19247 ASSERT_VK_SUCCESS(err);
19248
19249 VkDescriptorSetLayoutBinding dsl_binding = {};
19250 dsl_binding.binding = 2;
19251 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19252 dsl_binding.descriptorCount = 1;
19253 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19254 dsl_binding.pImmutableSamplers = NULL;
19255 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19256 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19257 ds_layout_ci.pNext = NULL;
19258 ds_layout_ci.bindingCount = 1;
19259 ds_layout_ci.pBindings = &dsl_binding;
19260 VkDescriptorSetLayout ds_layout;
19261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19262 ASSERT_VK_SUCCESS(err);
19263
19264 VkDescriptorSet descriptor_sets[3] = {};
19265 VkDescriptorSetAllocateInfo alloc_info = {};
19266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19267 alloc_info.descriptorSetCount = 1;
19268 alloc_info.descriptorPool = ds_pool;
19269 alloc_info.pSetLayouts = &ds_layout;
19270 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19271 ASSERT_VK_SUCCESS(err);
19272 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19274 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19275
19276 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19277
19278 m_errorMonitor->VerifyNotFound();
19279}
19280
Tony Barbour626994c2017-02-08 15:29:37 -070019281TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019282 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019283
19284 m_errorMonitor->ExpectSuccess();
19285
Tony Barbour1fa09702017-03-16 12:09:08 -060019286 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019287 VkCommandBuffer cmd_bufs[4];
19288 VkCommandBufferAllocateInfo alloc_info;
19289 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19290 alloc_info.pNext = NULL;
19291 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019292 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019293 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19294 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19295 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019296 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19297 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19298 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019299 ASSERT_TRUE(image.initialized());
19300 VkCommandBufferBeginInfo cb_binfo;
19301 cb_binfo.pNext = NULL;
19302 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19303 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19304 cb_binfo.flags = 0;
19305 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19306 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19307 VkImageMemoryBarrier img_barrier = {};
19308 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19309 img_barrier.pNext = NULL;
19310 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19311 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19312 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19313 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19314 img_barrier.image = image.handle();
19315 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19316 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19317 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19318 img_barrier.subresourceRange.baseArrayLayer = 0;
19319 img_barrier.subresourceRange.baseMipLevel = 0;
19320 img_barrier.subresourceRange.layerCount = 1;
19321 img_barrier.subresourceRange.levelCount = 1;
19322 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19323 &img_barrier);
19324 vkEndCommandBuffer(cmd_bufs[0]);
19325 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19326 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19327 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19328 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19329 &img_barrier);
19330 vkEndCommandBuffer(cmd_bufs[1]);
19331 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19332 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19333 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19334 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19335 &img_barrier);
19336 vkEndCommandBuffer(cmd_bufs[2]);
19337 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19338 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19339 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19340 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19341 &img_barrier);
19342 vkEndCommandBuffer(cmd_bufs[3]);
19343
19344 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19345 VkSemaphore semaphore1, semaphore2;
19346 VkSemaphoreCreateInfo semaphore_create_info{};
19347 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19348 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19349 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19350 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19351 VkSubmitInfo submit_info[3];
19352 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19353 submit_info[0].pNext = nullptr;
19354 submit_info[0].commandBufferCount = 1;
19355 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19356 submit_info[0].signalSemaphoreCount = 1;
19357 submit_info[0].pSignalSemaphores = &semaphore1;
19358 submit_info[0].waitSemaphoreCount = 0;
19359 submit_info[0].pWaitDstStageMask = nullptr;
19360 submit_info[0].pWaitDstStageMask = flags;
19361 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19362 submit_info[1].pNext = nullptr;
19363 submit_info[1].commandBufferCount = 1;
19364 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19365 submit_info[1].waitSemaphoreCount = 1;
19366 submit_info[1].pWaitSemaphores = &semaphore1;
19367 submit_info[1].signalSemaphoreCount = 1;
19368 submit_info[1].pSignalSemaphores = &semaphore2;
19369 submit_info[1].pWaitDstStageMask = flags;
19370 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19371 submit_info[2].pNext = nullptr;
19372 submit_info[2].commandBufferCount = 2;
19373 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19374 submit_info[2].waitSemaphoreCount = 1;
19375 submit_info[2].pWaitSemaphores = &semaphore2;
19376 submit_info[2].signalSemaphoreCount = 0;
19377 submit_info[2].pSignalSemaphores = nullptr;
19378 submit_info[2].pWaitDstStageMask = flags;
19379 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19380 vkQueueWaitIdle(m_device->m_queue);
19381
19382 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19383 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19384 m_errorMonitor->VerifyNotFound();
19385}
19386
Tobin Ehlis953e8392016-11-17 10:54:13 -070019387TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19388 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19389 // We previously had a bug where dynamic offset of inactive bindings was still being used
19390 VkResult err;
19391 m_errorMonitor->ExpectSuccess();
19392
Tony Barbour1fa09702017-03-16 12:09:08 -060019393 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019394 ASSERT_NO_FATAL_FAILURE(InitViewport());
19395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19396
19397 VkDescriptorPoolSize ds_type_count = {};
19398 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19399 ds_type_count.descriptorCount = 3;
19400
19401 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19402 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19403 ds_pool_ci.pNext = NULL;
19404 ds_pool_ci.maxSets = 1;
19405 ds_pool_ci.poolSizeCount = 1;
19406 ds_pool_ci.pPoolSizes = &ds_type_count;
19407
19408 VkDescriptorPool ds_pool;
19409 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19410 ASSERT_VK_SUCCESS(err);
19411
19412 const uint32_t BINDING_COUNT = 3;
19413 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019414 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019415 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19416 dsl_binding[0].descriptorCount = 1;
19417 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19418 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019419 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019420 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19421 dsl_binding[1].descriptorCount = 1;
19422 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19423 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019424 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019425 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19426 dsl_binding[2].descriptorCount = 1;
19427 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19428 dsl_binding[2].pImmutableSamplers = NULL;
19429
19430 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19431 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19432 ds_layout_ci.pNext = NULL;
19433 ds_layout_ci.bindingCount = BINDING_COUNT;
19434 ds_layout_ci.pBindings = dsl_binding;
19435 VkDescriptorSetLayout ds_layout;
19436 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19437 ASSERT_VK_SUCCESS(err);
19438
19439 VkDescriptorSet descriptor_set;
19440 VkDescriptorSetAllocateInfo alloc_info = {};
19441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19442 alloc_info.descriptorSetCount = 1;
19443 alloc_info.descriptorPool = ds_pool;
19444 alloc_info.pSetLayouts = &ds_layout;
19445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19446 ASSERT_VK_SUCCESS(err);
19447
19448 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19449 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19450 pipeline_layout_ci.pNext = NULL;
19451 pipeline_layout_ci.setLayoutCount = 1;
19452 pipeline_layout_ci.pSetLayouts = &ds_layout;
19453
19454 VkPipelineLayout pipeline_layout;
19455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19456 ASSERT_VK_SUCCESS(err);
19457
19458 // Create two buffers to update the descriptors with
19459 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19460 uint32_t qfi = 0;
19461 VkBufferCreateInfo buffCI = {};
19462 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19463 buffCI.size = 2048;
19464 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19465 buffCI.queueFamilyIndexCount = 1;
19466 buffCI.pQueueFamilyIndices = &qfi;
19467
19468 VkBuffer dyub1;
19469 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19470 ASSERT_VK_SUCCESS(err);
19471 // buffer2
19472 buffCI.size = 1024;
19473 VkBuffer dyub2;
19474 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19475 ASSERT_VK_SUCCESS(err);
19476 // Allocate memory and bind to buffers
19477 VkMemoryAllocateInfo mem_alloc[2] = {};
19478 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19479 mem_alloc[0].pNext = NULL;
19480 mem_alloc[0].memoryTypeIndex = 0;
19481 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19482 mem_alloc[1].pNext = NULL;
19483 mem_alloc[1].memoryTypeIndex = 0;
19484
19485 VkMemoryRequirements mem_reqs1;
19486 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19487 VkMemoryRequirements mem_reqs2;
19488 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19489 mem_alloc[0].allocationSize = mem_reqs1.size;
19490 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19491 mem_alloc[1].allocationSize = mem_reqs2.size;
19492 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19493 if (!pass) {
19494 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19495 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19496 return;
19497 }
19498
19499 VkDeviceMemory mem1;
19500 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19501 ASSERT_VK_SUCCESS(err);
19502 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19503 ASSERT_VK_SUCCESS(err);
19504 VkDeviceMemory mem2;
19505 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19506 ASSERT_VK_SUCCESS(err);
19507 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19508 ASSERT_VK_SUCCESS(err);
19509 // Update descriptors
19510 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19511 buff_info[0].buffer = dyub1;
19512 buff_info[0].offset = 0;
19513 buff_info[0].range = 256;
19514 buff_info[1].buffer = dyub1;
19515 buff_info[1].offset = 256;
19516 buff_info[1].range = 512;
19517 buff_info[2].buffer = dyub2;
19518 buff_info[2].offset = 0;
19519 buff_info[2].range = 512;
19520
19521 VkWriteDescriptorSet descriptor_write;
19522 memset(&descriptor_write, 0, sizeof(descriptor_write));
19523 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19524 descriptor_write.dstSet = descriptor_set;
19525 descriptor_write.dstBinding = 0;
19526 descriptor_write.descriptorCount = BINDING_COUNT;
19527 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19528 descriptor_write.pBufferInfo = buff_info;
19529
19530 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19531
Tony Barbour552f6c02016-12-21 14:34:07 -070019532 m_commandBuffer->BeginCommandBuffer();
19533 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019534
19535 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019536 char const *vsSource =
19537 "#version 450\n"
19538 "\n"
19539 "out gl_PerVertex { \n"
19540 " vec4 gl_Position;\n"
19541 "};\n"
19542 "void main(){\n"
19543 " gl_Position = vec4(1);\n"
19544 "}\n";
19545 char const *fsSource =
19546 "#version 450\n"
19547 "\n"
19548 "layout(location=0) out vec4 x;\n"
19549 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19550 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19551 "void main(){\n"
19552 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19553 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019554 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19555 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19556 VkPipelineObj pipe(m_device);
19557 pipe.SetViewport(m_viewports);
19558 pipe.SetScissor(m_scissors);
19559 pipe.AddShader(&vs);
19560 pipe.AddShader(&fs);
19561 pipe.AddColorAttachment();
19562 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19563
19564 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19565 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19566 // we used to have a bug in this case.
19567 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19568 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19569 &descriptor_set, BINDING_COUNT, dyn_off);
19570 Draw(1, 0, 0, 0);
19571 m_errorMonitor->VerifyNotFound();
19572
19573 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19574 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19575 vkFreeMemory(m_device->device(), mem1, NULL);
19576 vkFreeMemory(m_device->device(), mem2, NULL);
19577
19578 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19579 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19580 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19581}
19582
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019583TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019584 TEST_DESCRIPTION(
19585 "Ensure that validations handling of non-coherent memory "
19586 "mapping while using VK_WHOLE_SIZE does not cause access "
19587 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019588 VkResult err;
19589 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019590 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019591
19592 VkDeviceMemory mem;
19593 VkMemoryRequirements mem_reqs;
19594 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019595 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019596 VkMemoryAllocateInfo alloc_info = {};
19597 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19598 alloc_info.pNext = NULL;
19599 alloc_info.memoryTypeIndex = 0;
19600
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019601 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019602 alloc_info.allocationSize = allocation_size;
19603
19604 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19605 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 -070019606 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019607 if (!pass) {
19608 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019609 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19610 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019611 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019612 pass = m_device->phy().set_memory_type(
19613 mem_reqs.memoryTypeBits, &alloc_info,
19614 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19615 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019616 if (!pass) {
19617 return;
19618 }
19619 }
19620 }
19621
19622 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19623 ASSERT_VK_SUCCESS(err);
19624
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019625 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019626 m_errorMonitor->ExpectSuccess();
19627 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19628 ASSERT_VK_SUCCESS(err);
19629 VkMappedMemoryRange mmr = {};
19630 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19631 mmr.memory = mem;
19632 mmr.offset = 0;
19633 mmr.size = VK_WHOLE_SIZE;
19634 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19635 ASSERT_VK_SUCCESS(err);
19636 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19637 ASSERT_VK_SUCCESS(err);
19638 m_errorMonitor->VerifyNotFound();
19639 vkUnmapMemory(m_device->device(), mem);
19640
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019641 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019642 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019643 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019644 ASSERT_VK_SUCCESS(err);
19645 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19646 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019647 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019648 mmr.size = VK_WHOLE_SIZE;
19649 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19650 ASSERT_VK_SUCCESS(err);
19651 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19652 ASSERT_VK_SUCCESS(err);
19653 m_errorMonitor->VerifyNotFound();
19654 vkUnmapMemory(m_device->device(), mem);
19655
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019656 // Map with offset and size
19657 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019658 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019659 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019660 ASSERT_VK_SUCCESS(err);
19661 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19662 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019663 mmr.offset = 4 * atom_size;
19664 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019665 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19666 ASSERT_VK_SUCCESS(err);
19667 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19668 ASSERT_VK_SUCCESS(err);
19669 m_errorMonitor->VerifyNotFound();
19670 vkUnmapMemory(m_device->device(), mem);
19671
19672 // Map without offset and flush WHOLE_SIZE with two separate offsets
19673 m_errorMonitor->ExpectSuccess();
19674 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19675 ASSERT_VK_SUCCESS(err);
19676 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19677 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019678 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019679 mmr.size = VK_WHOLE_SIZE;
19680 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019682 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019683 mmr.size = VK_WHOLE_SIZE;
19684 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19685 ASSERT_VK_SUCCESS(err);
19686 m_errorMonitor->VerifyNotFound();
19687 vkUnmapMemory(m_device->device(), mem);
19688
19689 vkFreeMemory(m_device->device(), mem, NULL);
19690}
19691
19692// This is a positive test. We used to expect error in this case but spec now allows it
19693TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19694 m_errorMonitor->ExpectSuccess();
19695 vk_testing::Fence testFence;
19696 VkFenceCreateInfo fenceInfo = {};
19697 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19698 fenceInfo.pNext = NULL;
19699
Tony Barbour1fa09702017-03-16 12:09:08 -060019700 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019701 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019702 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019703 VkResult result = vkResetFences(m_device->device(), 1, fences);
19704 ASSERT_VK_SUCCESS(result);
19705
19706 m_errorMonitor->VerifyNotFound();
19707}
19708
19709TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19710 m_errorMonitor->ExpectSuccess();
19711
Tony Barbour1fa09702017-03-16 12:09:08 -060019712 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019713 VkResult err;
19714
19715 // Record (empty!) command buffer that can be submitted multiple times
19716 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019717 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19718 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019719 m_commandBuffer->BeginCommandBuffer(&cbbi);
19720 m_commandBuffer->EndCommandBuffer();
19721
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019722 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019723 VkFence fence;
19724 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19725 ASSERT_VK_SUCCESS(err);
19726
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019727 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019728 VkSemaphore s1, s2;
19729 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19730 ASSERT_VK_SUCCESS(err);
19731 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19732 ASSERT_VK_SUCCESS(err);
19733
19734 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019735 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019736 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19737 ASSERT_VK_SUCCESS(err);
19738
19739 // Submit CB again, signaling s2.
19740 si.pSignalSemaphores = &s2;
19741 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19742 ASSERT_VK_SUCCESS(err);
19743
19744 // Wait for fence.
19745 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19746 ASSERT_VK_SUCCESS(err);
19747
19748 // CB is still in flight from second submission, but semaphore s1 is no
19749 // longer in flight. delete it.
19750 vkDestroySemaphore(m_device->device(), s1, nullptr);
19751
19752 m_errorMonitor->VerifyNotFound();
19753
19754 // Force device idle and clean up remaining objects
19755 vkDeviceWaitIdle(m_device->device());
19756 vkDestroySemaphore(m_device->device(), s2, nullptr);
19757 vkDestroyFence(m_device->device(), fence, nullptr);
19758}
19759
19760TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19761 m_errorMonitor->ExpectSuccess();
19762
Tony Barbour1fa09702017-03-16 12:09:08 -060019763 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019764 VkResult err;
19765
19766 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019767 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019768 VkFence f1;
19769 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19770 ASSERT_VK_SUCCESS(err);
19771
19772 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019773 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019774 VkFence f2;
19775 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19776 ASSERT_VK_SUCCESS(err);
19777
19778 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019779 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019780 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19781
19782 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019783 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019784 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19785
19786 // Should have both retired!
19787 vkDestroyFence(m_device->device(), f1, nullptr);
19788 vkDestroyFence(m_device->device(), f2, nullptr);
19789
19790 m_errorMonitor->VerifyNotFound();
19791}
19792
19793TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019794 TEST_DESCRIPTION(
19795 "Verify that creating an image view from an image with valid usage "
19796 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019797
Tony Barbour1fa09702017-03-16 12:09:08 -060019798 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019799
19800 m_errorMonitor->ExpectSuccess();
19801 // Verify that we can create a view with usage INPUT_ATTACHMENT
19802 VkImageObj image(m_device);
19803 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19804 ASSERT_TRUE(image.initialized());
19805 VkImageView imageView;
19806 VkImageViewCreateInfo ivci = {};
19807 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19808 ivci.image = image.handle();
19809 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19810 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19811 ivci.subresourceRange.layerCount = 1;
19812 ivci.subresourceRange.baseMipLevel = 0;
19813 ivci.subresourceRange.levelCount = 1;
19814 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19815
19816 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19817 m_errorMonitor->VerifyNotFound();
19818 vkDestroyImageView(m_device->device(), imageView, NULL);
19819}
19820
19821// This is a positive test. No failures are expected.
19822TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019823 TEST_DESCRIPTION(
19824 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19825 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019826
Tony Barbour1fa09702017-03-16 12:09:08 -060019827 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019828
19829 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019830 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019831 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019832
19833 m_errorMonitor->ExpectSuccess();
19834
19835 VkImage image;
19836 VkImageCreateInfo image_create_info = {};
19837 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19838 image_create_info.pNext = NULL;
19839 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19840 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19841 image_create_info.extent.width = 64;
19842 image_create_info.extent.height = 64;
19843 image_create_info.extent.depth = 1;
19844 image_create_info.mipLevels = 1;
19845 image_create_info.arrayLayers = 1;
19846 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19847 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19848 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19849 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19850 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19851 ASSERT_VK_SUCCESS(err);
19852
19853 VkMemoryRequirements memory_reqs;
19854 VkDeviceMemory memory_one, memory_two;
19855 bool pass;
19856 VkMemoryAllocateInfo memory_info = {};
19857 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19858 memory_info.pNext = NULL;
19859 memory_info.allocationSize = 0;
19860 memory_info.memoryTypeIndex = 0;
19861 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19862 // Find an image big enough to allow sparse mapping of 2 memory regions
19863 // Increase the image size until it is at least twice the
19864 // size of the required alignment, to ensure we can bind both
19865 // allocated memory blocks to the image on aligned offsets.
19866 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19867 vkDestroyImage(m_device->device(), image, nullptr);
19868 image_create_info.extent.width *= 2;
19869 image_create_info.extent.height *= 2;
19870 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19871 ASSERT_VK_SUCCESS(err);
19872 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19873 }
19874 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19875 // at the end of the first
19876 memory_info.allocationSize = memory_reqs.alignment;
19877 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19878 ASSERT_TRUE(pass);
19879 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19880 ASSERT_VK_SUCCESS(err);
19881 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19882 ASSERT_VK_SUCCESS(err);
19883 VkSparseMemoryBind binds[2];
19884 binds[0].flags = 0;
19885 binds[0].memory = memory_one;
19886 binds[0].memoryOffset = 0;
19887 binds[0].resourceOffset = 0;
19888 binds[0].size = memory_info.allocationSize;
19889 binds[1].flags = 0;
19890 binds[1].memory = memory_two;
19891 binds[1].memoryOffset = 0;
19892 binds[1].resourceOffset = memory_info.allocationSize;
19893 binds[1].size = memory_info.allocationSize;
19894
19895 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19896 opaqueBindInfo.image = image;
19897 opaqueBindInfo.bindCount = 2;
19898 opaqueBindInfo.pBinds = binds;
19899
19900 VkFence fence = VK_NULL_HANDLE;
19901 VkBindSparseInfo bindSparseInfo = {};
19902 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19903 bindSparseInfo.imageOpaqueBindCount = 1;
19904 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19905
19906 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19907 vkQueueWaitIdle(m_device->m_queue);
19908 vkDestroyImage(m_device->device(), image, NULL);
19909 vkFreeMemory(m_device->device(), memory_one, NULL);
19910 vkFreeMemory(m_device->device(), memory_two, NULL);
19911 m_errorMonitor->VerifyNotFound();
19912}
19913
19914TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019915 TEST_DESCRIPTION(
19916 "Ensure that CmdBeginRenderPass with an attachment's "
19917 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19918 "the command buffer has prior knowledge of that "
19919 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019920
19921 m_errorMonitor->ExpectSuccess();
19922
Tony Barbour1fa09702017-03-16 12:09:08 -060019923 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019924
19925 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019926 VkAttachmentDescription attachment = {0,
19927 VK_FORMAT_R8G8B8A8_UNORM,
19928 VK_SAMPLE_COUNT_1_BIT,
19929 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19930 VK_ATTACHMENT_STORE_OP_STORE,
19931 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19932 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19933 VK_IMAGE_LAYOUT_UNDEFINED,
19934 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019935
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019936 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019937
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019938 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019939
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019940 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019941
19942 VkRenderPass rp;
19943 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19944 ASSERT_VK_SUCCESS(err);
19945
19946 // A compatible framebuffer.
19947 VkImageObj image(m_device);
19948 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19949 ASSERT_TRUE(image.initialized());
19950
19951 VkImageViewCreateInfo ivci = {
19952 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19953 nullptr,
19954 0,
19955 image.handle(),
19956 VK_IMAGE_VIEW_TYPE_2D,
19957 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019958 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19959 VK_COMPONENT_SWIZZLE_IDENTITY},
19960 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 };
19962 VkImageView view;
19963 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19964 ASSERT_VK_SUCCESS(err);
19965
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019966 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019967 VkFramebuffer fb;
19968 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19969 ASSERT_VK_SUCCESS(err);
19970
19971 // Record a single command buffer which uses this renderpass twice. The
19972 // bug is triggered at the beginning of the second renderpass, when the
19973 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019974 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 -070019975 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019976 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19977 vkCmdEndRenderPass(m_commandBuffer->handle());
19978 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19979
19980 m_errorMonitor->VerifyNotFound();
19981
19982 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019983 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019984
19985 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19986 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19987 vkDestroyImageView(m_device->device(), view, nullptr);
19988}
19989
19990TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019991 TEST_DESCRIPTION(
19992 "This test should pass. Create a Framebuffer and "
19993 "command buffer, bind them together, then destroy "
19994 "command pool and framebuffer and verify there are no "
19995 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019996
19997 m_errorMonitor->ExpectSuccess();
19998
Tony Barbour1fa09702017-03-16 12:09:08 -060019999 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020000
20001 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020002 VkAttachmentDescription attachment = {0,
20003 VK_FORMAT_R8G8B8A8_UNORM,
20004 VK_SAMPLE_COUNT_1_BIT,
20005 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20006 VK_ATTACHMENT_STORE_OP_STORE,
20007 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20008 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20009 VK_IMAGE_LAYOUT_UNDEFINED,
20010 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020011
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020012 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020013
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020014 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020015
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020016 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020017
20018 VkRenderPass rp;
20019 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20020 ASSERT_VK_SUCCESS(err);
20021
20022 // A compatible framebuffer.
20023 VkImageObj image(m_device);
20024 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20025 ASSERT_TRUE(image.initialized());
20026
20027 VkImageViewCreateInfo ivci = {
20028 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20029 nullptr,
20030 0,
20031 image.handle(),
20032 VK_IMAGE_VIEW_TYPE_2D,
20033 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020034 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20035 VK_COMPONENT_SWIZZLE_IDENTITY},
20036 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037 };
20038 VkImageView view;
20039 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20040 ASSERT_VK_SUCCESS(err);
20041
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020042 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020043 VkFramebuffer fb;
20044 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20045 ASSERT_VK_SUCCESS(err);
20046
20047 // Explicitly create a command buffer to bind the FB to so that we can then
20048 // destroy the command pool in order to implicitly free command buffer
20049 VkCommandPool command_pool;
20050 VkCommandPoolCreateInfo pool_create_info{};
20051 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20052 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20053 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20054 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20055
20056 VkCommandBuffer command_buffer;
20057 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20058 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20059 command_buffer_allocate_info.commandPool = command_pool;
20060 command_buffer_allocate_info.commandBufferCount = 1;
20061 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20062 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20063
20064 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020065 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 -060020066 VkCommandBufferBeginInfo begin_info{};
20067 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20068 vkBeginCommandBuffer(command_buffer, &begin_info);
20069
20070 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20071 vkCmdEndRenderPass(command_buffer);
20072 vkEndCommandBuffer(command_buffer);
20073 vkDestroyImageView(m_device->device(), view, nullptr);
20074 // Destroy command pool to implicitly free command buffer
20075 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20076 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20077 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20078 m_errorMonitor->VerifyNotFound();
20079}
20080
20081TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020082 TEST_DESCRIPTION(
20083 "Ensure that CmdBeginRenderPass applies the layout "
20084 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020085
20086 m_errorMonitor->ExpectSuccess();
20087
Tony Barbour1fa09702017-03-16 12:09:08 -060020088 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020089
20090 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020091 VkAttachmentDescription attachment = {0,
20092 VK_FORMAT_R8G8B8A8_UNORM,
20093 VK_SAMPLE_COUNT_1_BIT,
20094 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20095 VK_ATTACHMENT_STORE_OP_STORE,
20096 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20097 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20098 VK_IMAGE_LAYOUT_UNDEFINED,
20099 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020100
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020101 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020102
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020103 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020104
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020105 VkSubpassDependency dep = {0,
20106 0,
20107 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20108 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20109 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20110 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20111 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020112
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020113 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020114
20115 VkResult err;
20116 VkRenderPass rp;
20117 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20118 ASSERT_VK_SUCCESS(err);
20119
20120 // A compatible framebuffer.
20121 VkImageObj image(m_device);
20122 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20123 ASSERT_TRUE(image.initialized());
20124
20125 VkImageViewCreateInfo ivci = {
20126 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20127 nullptr,
20128 0,
20129 image.handle(),
20130 VK_IMAGE_VIEW_TYPE_2D,
20131 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020132 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20133 VK_COMPONENT_SWIZZLE_IDENTITY},
20134 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020135 };
20136 VkImageView view;
20137 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20138 ASSERT_VK_SUCCESS(err);
20139
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020140 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020141 VkFramebuffer fb;
20142 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20143 ASSERT_VK_SUCCESS(err);
20144
20145 // Record a single command buffer which issues a pipeline barrier w/
20146 // image memory barrier for the attachment. This detects the previously
20147 // missing tracking of the subpass layout by throwing a validation error
20148 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020149 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 -070020150 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20152
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020153 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20154 nullptr,
20155 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20156 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20157 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20158 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20159 VK_QUEUE_FAMILY_IGNORED,
20160 VK_QUEUE_FAMILY_IGNORED,
20161 image.handle(),
20162 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020163 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020164 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20165 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020166
20167 vkCmdEndRenderPass(m_commandBuffer->handle());
20168 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020169 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020170
20171 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20172 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20173 vkDestroyImageView(m_device->device(), view, nullptr);
20174}
20175
20176TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020177 TEST_DESCRIPTION(
20178 "Validate that when an imageView of a depth/stencil image "
20179 "is used as a depth/stencil framebuffer attachment, the "
20180 "aspectMask is ignored and both depth and stencil image "
20181 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020182
Tony Barbour1fa09702017-03-16 12:09:08 -060020183 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020184 VkFormatProperties format_properties;
20185 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20186 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20187 return;
20188 }
20189
20190 m_errorMonitor->ExpectSuccess();
20191
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020192 VkAttachmentDescription attachment = {0,
20193 VK_FORMAT_D32_SFLOAT_S8_UINT,
20194 VK_SAMPLE_COUNT_1_BIT,
20195 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20196 VK_ATTACHMENT_STORE_OP_STORE,
20197 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20198 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20199 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20200 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020201
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020202 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020204 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020205
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020206 VkSubpassDependency dep = {0,
20207 0,
20208 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20209 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20210 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20211 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20212 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020213
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020214 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020215
20216 VkResult err;
20217 VkRenderPass rp;
20218 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20219 ASSERT_VK_SUCCESS(err);
20220
20221 VkImageObj image(m_device);
20222 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020223 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020224 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020225 ASSERT_TRUE(image.initialized());
20226 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20227
20228 VkImageViewCreateInfo ivci = {
20229 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20230 nullptr,
20231 0,
20232 image.handle(),
20233 VK_IMAGE_VIEW_TYPE_2D,
20234 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020235 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20236 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020237 };
20238 VkImageView view;
20239 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20240 ASSERT_VK_SUCCESS(err);
20241
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020242 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020243 VkFramebuffer fb;
20244 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20245 ASSERT_VK_SUCCESS(err);
20246
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020247 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 -070020248 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20250
20251 VkImageMemoryBarrier imb = {};
20252 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20253 imb.pNext = nullptr;
20254 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20255 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20256 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20257 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20258 imb.srcQueueFamilyIndex = 0;
20259 imb.dstQueueFamilyIndex = 0;
20260 imb.image = image.handle();
20261 imb.subresourceRange.aspectMask = 0x6;
20262 imb.subresourceRange.baseMipLevel = 0;
20263 imb.subresourceRange.levelCount = 0x1;
20264 imb.subresourceRange.baseArrayLayer = 0;
20265 imb.subresourceRange.layerCount = 0x1;
20266
20267 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020268 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20269 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020270
20271 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020272 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020273 QueueCommandBuffer(false);
20274 m_errorMonitor->VerifyNotFound();
20275
20276 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20277 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20278 vkDestroyImageView(m_device->device(), view, nullptr);
20279}
20280
20281TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020282 TEST_DESCRIPTION(
20283 "Ensure that layout transitions work correctly without "
20284 "errors, when an attachment reference is "
20285 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020286
20287 m_errorMonitor->ExpectSuccess();
20288
Tony Barbour1fa09702017-03-16 12:09:08 -060020289 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020290
20291 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020292 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020293
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020294 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020295
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020296 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020297
20298 VkRenderPass rp;
20299 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20300 ASSERT_VK_SUCCESS(err);
20301
20302 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020303 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020304 VkFramebuffer fb;
20305 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20306 ASSERT_VK_SUCCESS(err);
20307
20308 // Record a command buffer which just begins and ends the renderpass. The
20309 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020310 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 -070020311 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020312 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20313 vkCmdEndRenderPass(m_commandBuffer->handle());
20314 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020315 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020316
20317 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20318 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20319}
20320
20321// This is a positive test. No errors are expected.
20322TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020323 TEST_DESCRIPTION(
20324 "Create a stencil-only attachment with a LOAD_OP set to "
20325 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020326 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020327 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020328 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020329 if (!depth_format) {
20330 printf(" No Depth + Stencil format found. Skipped.\n");
20331 return;
20332 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020333 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020334 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020335 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20336 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020337 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20338 return;
20339 }
20340
Tony Barbourf887b162017-03-09 10:06:46 -070020341 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020342 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020343 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020344 VkAttachmentDescription att = {};
20345 VkAttachmentReference ref = {};
20346 att.format = depth_stencil_fmt;
20347 att.samples = VK_SAMPLE_COUNT_1_BIT;
20348 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20349 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20350 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20351 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20352 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20353 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20354
20355 VkClearValue clear;
20356 clear.depthStencil.depth = 1.0;
20357 clear.depthStencil.stencil = 0;
20358 ref.attachment = 0;
20359 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20360
20361 VkSubpassDescription subpass = {};
20362 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20363 subpass.flags = 0;
20364 subpass.inputAttachmentCount = 0;
20365 subpass.pInputAttachments = NULL;
20366 subpass.colorAttachmentCount = 0;
20367 subpass.pColorAttachments = NULL;
20368 subpass.pResolveAttachments = NULL;
20369 subpass.pDepthStencilAttachment = &ref;
20370 subpass.preserveAttachmentCount = 0;
20371 subpass.pPreserveAttachments = NULL;
20372
20373 VkRenderPass rp;
20374 VkRenderPassCreateInfo rp_info = {};
20375 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20376 rp_info.attachmentCount = 1;
20377 rp_info.pAttachments = &att;
20378 rp_info.subpassCount = 1;
20379 rp_info.pSubpasses = &subpass;
20380 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20381 ASSERT_VK_SUCCESS(result);
20382
20383 VkImageView *depthView = m_depthStencil->BindInfo();
20384 VkFramebufferCreateInfo fb_info = {};
20385 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20386 fb_info.pNext = NULL;
20387 fb_info.renderPass = rp;
20388 fb_info.attachmentCount = 1;
20389 fb_info.pAttachments = depthView;
20390 fb_info.width = 100;
20391 fb_info.height = 100;
20392 fb_info.layers = 1;
20393 VkFramebuffer fb;
20394 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20395 ASSERT_VK_SUCCESS(result);
20396
20397 VkRenderPassBeginInfo rpbinfo = {};
20398 rpbinfo.clearValueCount = 1;
20399 rpbinfo.pClearValues = &clear;
20400 rpbinfo.pNext = NULL;
20401 rpbinfo.renderPass = rp;
20402 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20403 rpbinfo.renderArea.extent.width = 100;
20404 rpbinfo.renderArea.extent.height = 100;
20405 rpbinfo.renderArea.offset.x = 0;
20406 rpbinfo.renderArea.offset.y = 0;
20407 rpbinfo.framebuffer = fb;
20408
20409 VkFence fence = {};
20410 VkFenceCreateInfo fence_ci = {};
20411 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20412 fence_ci.pNext = nullptr;
20413 fence_ci.flags = 0;
20414 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20415 ASSERT_VK_SUCCESS(result);
20416
20417 m_commandBuffer->BeginCommandBuffer();
20418 m_commandBuffer->BeginRenderPass(rpbinfo);
20419 m_commandBuffer->EndRenderPass();
20420 m_commandBuffer->EndCommandBuffer();
20421 m_commandBuffer->QueueCommandBuffer(fence);
20422
20423 VkImageObj destImage(m_device);
20424 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020425 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020426 VkImageMemoryBarrier barrier = {};
20427 VkImageSubresourceRange range;
20428 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20429 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20430 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20431 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20432 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20433 barrier.image = m_depthStencil->handle();
20434 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20435 range.baseMipLevel = 0;
20436 range.levelCount = 1;
20437 range.baseArrayLayer = 0;
20438 range.layerCount = 1;
20439 barrier.subresourceRange = range;
20440 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20441 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20442 cmdbuf.BeginCommandBuffer();
20443 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 -070020444 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020445 barrier.srcAccessMask = 0;
20446 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20447 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20448 barrier.image = destImage.handle();
20449 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20450 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 -070020451 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020452 VkImageCopy cregion;
20453 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20454 cregion.srcSubresource.mipLevel = 0;
20455 cregion.srcSubresource.baseArrayLayer = 0;
20456 cregion.srcSubresource.layerCount = 1;
20457 cregion.srcOffset.x = 0;
20458 cregion.srcOffset.y = 0;
20459 cregion.srcOffset.z = 0;
20460 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20461 cregion.dstSubresource.mipLevel = 0;
20462 cregion.dstSubresource.baseArrayLayer = 0;
20463 cregion.dstSubresource.layerCount = 1;
20464 cregion.dstOffset.x = 0;
20465 cregion.dstOffset.y = 0;
20466 cregion.dstOffset.z = 0;
20467 cregion.extent.width = 100;
20468 cregion.extent.height = 100;
20469 cregion.extent.depth = 1;
20470 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020471 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020472 cmdbuf.EndCommandBuffer();
20473
20474 VkSubmitInfo submit_info;
20475 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20476 submit_info.pNext = NULL;
20477 submit_info.waitSemaphoreCount = 0;
20478 submit_info.pWaitSemaphores = NULL;
20479 submit_info.pWaitDstStageMask = NULL;
20480 submit_info.commandBufferCount = 1;
20481 submit_info.pCommandBuffers = &cmdbuf.handle();
20482 submit_info.signalSemaphoreCount = 0;
20483 submit_info.pSignalSemaphores = NULL;
20484
20485 m_errorMonitor->ExpectSuccess();
20486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20487 m_errorMonitor->VerifyNotFound();
20488
20489 vkQueueWaitIdle(m_device->m_queue);
20490 vkDestroyFence(m_device->device(), fence, nullptr);
20491 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20492 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20493}
20494
20495// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020496TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20497 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20498
20499 m_errorMonitor->ExpectSuccess();
20500
Tony Barbour1fa09702017-03-16 12:09:08 -060020501 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020502 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020503 if (!depth_format) {
20504 printf(" No Depth + Stencil format found. Skipped.\n");
20505 return;
20506 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20508
20509 VkImageMemoryBarrier img_barrier = {};
20510 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20511 img_barrier.pNext = NULL;
20512 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20513 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20514 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20515 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20516 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20517 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20518 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20519 img_barrier.subresourceRange.baseArrayLayer = 0;
20520 img_barrier.subresourceRange.baseMipLevel = 0;
20521 img_barrier.subresourceRange.layerCount = 1;
20522 img_barrier.subresourceRange.levelCount = 1;
20523
20524 {
20525 VkImageObj img_color(m_device);
20526 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20527 ASSERT_TRUE(img_color.initialized());
20528
20529 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020530 img_ds1.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020531 ASSERT_TRUE(img_ds1.initialized());
20532
20533 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020534 img_ds2.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020535 ASSERT_TRUE(img_ds2.initialized());
20536
20537 VkImageObj img_xfer_src(m_device);
20538 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20539 ASSERT_TRUE(img_xfer_src.initialized());
20540
20541 VkImageObj img_xfer_dst(m_device);
20542 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20543 ASSERT_TRUE(img_xfer_dst.initialized());
20544
20545 VkImageObj img_sampled(m_device);
20546 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20547 ASSERT_TRUE(img_sampled.initialized());
20548
20549 VkImageObj img_input(m_device);
20550 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20551 ASSERT_TRUE(img_input.initialized());
20552
20553 const struct {
20554 VkImageObj &image_obj;
20555 VkImageLayout old_layout;
20556 VkImageLayout new_layout;
20557 } buffer_layouts[] = {
20558 // clang-format off
20559 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20560 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20561 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20562 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20563 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20564 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20565 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20566 // clang-format on
20567 };
20568 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20569
20570 m_commandBuffer->BeginCommandBuffer();
20571 for (uint32_t i = 0; i < layout_count; ++i) {
20572 img_barrier.image = buffer_layouts[i].image_obj.handle();
20573 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20574 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20575 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20576 : VK_IMAGE_ASPECT_COLOR_BIT;
20577
20578 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20579 img_barrier.newLayout = buffer_layouts[i].new_layout;
20580 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20581 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20582
20583 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20584 img_barrier.newLayout = buffer_layouts[i].old_layout;
20585 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20586 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20587 }
20588 m_commandBuffer->EndCommandBuffer();
20589
20590 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20591 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20592 }
20593 m_errorMonitor->VerifyNotFound();
20594}
20595
20596// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020597TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20598 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20599
20600 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020601 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020602
20603 VkEvent event;
20604 VkEventCreateInfo event_create_info{};
20605 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20606 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20607
20608 VkCommandPool command_pool;
20609 VkCommandPoolCreateInfo pool_create_info{};
20610 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20611 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20612 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20613 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20614
20615 VkCommandBuffer command_buffer;
20616 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20617 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20618 command_buffer_allocate_info.commandPool = command_pool;
20619 command_buffer_allocate_info.commandBufferCount = 1;
20620 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20621 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20622
20623 VkQueue queue = VK_NULL_HANDLE;
20624 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20625
20626 {
20627 VkCommandBufferBeginInfo begin_info{};
20628 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20629 vkBeginCommandBuffer(command_buffer, &begin_info);
20630
20631 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 -070020632 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020633 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20634 vkEndCommandBuffer(command_buffer);
20635 }
20636 {
20637 VkSubmitInfo submit_info{};
20638 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20639 submit_info.commandBufferCount = 1;
20640 submit_info.pCommandBuffers = &command_buffer;
20641 submit_info.signalSemaphoreCount = 0;
20642 submit_info.pSignalSemaphores = nullptr;
20643 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20644 }
20645 { vkSetEvent(m_device->device(), event); }
20646
20647 vkQueueWaitIdle(queue);
20648
20649 vkDestroyEvent(m_device->device(), event, nullptr);
20650 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20651 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20652
20653 m_errorMonitor->VerifyNotFound();
20654}
20655// This is a positive test. No errors should be generated.
20656TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20657 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20658
Tony Barbour1fa09702017-03-16 12:09:08 -060020659 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020660 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020661
20662 m_errorMonitor->ExpectSuccess();
20663
20664 VkQueryPool query_pool;
20665 VkQueryPoolCreateInfo query_pool_create_info{};
20666 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20667 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20668 query_pool_create_info.queryCount = 1;
20669 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20670
20671 VkCommandPool command_pool;
20672 VkCommandPoolCreateInfo pool_create_info{};
20673 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20674 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20675 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20676 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20677
20678 VkCommandBuffer command_buffer;
20679 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20680 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20681 command_buffer_allocate_info.commandPool = command_pool;
20682 command_buffer_allocate_info.commandBufferCount = 1;
20683 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20684 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20685
20686 VkCommandBuffer secondary_command_buffer;
20687 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20688 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20689
20690 VkQueue queue = VK_NULL_HANDLE;
20691 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20692
20693 uint32_t qfi = 0;
20694 VkBufferCreateInfo buff_create_info = {};
20695 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20696 buff_create_info.size = 1024;
20697 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20698 buff_create_info.queueFamilyIndexCount = 1;
20699 buff_create_info.pQueueFamilyIndices = &qfi;
20700
20701 VkResult err;
20702 VkBuffer buffer;
20703 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20704 ASSERT_VK_SUCCESS(err);
20705 VkMemoryAllocateInfo mem_alloc = {};
20706 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20707 mem_alloc.pNext = NULL;
20708 mem_alloc.allocationSize = 1024;
20709 mem_alloc.memoryTypeIndex = 0;
20710
20711 VkMemoryRequirements memReqs;
20712 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20713 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20714 if (!pass) {
20715 vkDestroyBuffer(m_device->device(), buffer, NULL);
20716 return;
20717 }
20718
20719 VkDeviceMemory mem;
20720 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20721 ASSERT_VK_SUCCESS(err);
20722 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20723 ASSERT_VK_SUCCESS(err);
20724
20725 VkCommandBufferInheritanceInfo hinfo = {};
20726 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20727 hinfo.renderPass = VK_NULL_HANDLE;
20728 hinfo.subpass = 0;
20729 hinfo.framebuffer = VK_NULL_HANDLE;
20730 hinfo.occlusionQueryEnable = VK_FALSE;
20731 hinfo.queryFlags = 0;
20732 hinfo.pipelineStatistics = 0;
20733
20734 {
20735 VkCommandBufferBeginInfo begin_info{};
20736 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20737 begin_info.pInheritanceInfo = &hinfo;
20738 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20739
20740 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20741 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20742
20743 vkEndCommandBuffer(secondary_command_buffer);
20744
20745 begin_info.pInheritanceInfo = nullptr;
20746 vkBeginCommandBuffer(command_buffer, &begin_info);
20747
20748 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20749 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20750
20751 vkEndCommandBuffer(command_buffer);
20752 }
20753 {
20754 VkSubmitInfo submit_info{};
20755 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20756 submit_info.commandBufferCount = 1;
20757 submit_info.pCommandBuffers = &command_buffer;
20758 submit_info.signalSemaphoreCount = 0;
20759 submit_info.pSignalSemaphores = nullptr;
20760 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20761 }
20762
20763 vkQueueWaitIdle(queue);
20764
20765 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20766 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20767 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20768 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20769 vkDestroyBuffer(m_device->device(), buffer, NULL);
20770 vkFreeMemory(m_device->device(), mem, NULL);
20771
20772 m_errorMonitor->VerifyNotFound();
20773}
20774
20775// This is a positive test. No errors should be generated.
20776TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20777 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20778
Tony Barbour1fa09702017-03-16 12:09:08 -060020779 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020780 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020781
20782 m_errorMonitor->ExpectSuccess();
20783
20784 VkQueryPool query_pool;
20785 VkQueryPoolCreateInfo query_pool_create_info{};
20786 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20787 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20788 query_pool_create_info.queryCount = 1;
20789 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20790
20791 VkCommandPool command_pool;
20792 VkCommandPoolCreateInfo pool_create_info{};
20793 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20794 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20795 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20796 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20797
20798 VkCommandBuffer command_buffer[2];
20799 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20800 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20801 command_buffer_allocate_info.commandPool = command_pool;
20802 command_buffer_allocate_info.commandBufferCount = 2;
20803 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20804 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20805
20806 VkQueue queue = VK_NULL_HANDLE;
20807 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20808
20809 uint32_t qfi = 0;
20810 VkBufferCreateInfo buff_create_info = {};
20811 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20812 buff_create_info.size = 1024;
20813 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20814 buff_create_info.queueFamilyIndexCount = 1;
20815 buff_create_info.pQueueFamilyIndices = &qfi;
20816
20817 VkResult err;
20818 VkBuffer buffer;
20819 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20820 ASSERT_VK_SUCCESS(err);
20821 VkMemoryAllocateInfo mem_alloc = {};
20822 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20823 mem_alloc.pNext = NULL;
20824 mem_alloc.allocationSize = 1024;
20825 mem_alloc.memoryTypeIndex = 0;
20826
20827 VkMemoryRequirements memReqs;
20828 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20829 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20830 if (!pass) {
20831 vkDestroyBuffer(m_device->device(), buffer, NULL);
20832 return;
20833 }
20834
20835 VkDeviceMemory mem;
20836 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20837 ASSERT_VK_SUCCESS(err);
20838 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20839 ASSERT_VK_SUCCESS(err);
20840
20841 {
20842 VkCommandBufferBeginInfo begin_info{};
20843 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20844 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20845
20846 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20847 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20848
20849 vkEndCommandBuffer(command_buffer[0]);
20850
20851 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20852
20853 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20854
20855 vkEndCommandBuffer(command_buffer[1]);
20856 }
20857 {
20858 VkSubmitInfo submit_info{};
20859 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20860 submit_info.commandBufferCount = 2;
20861 submit_info.pCommandBuffers = command_buffer;
20862 submit_info.signalSemaphoreCount = 0;
20863 submit_info.pSignalSemaphores = nullptr;
20864 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20865 }
20866
20867 vkQueueWaitIdle(queue);
20868
20869 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20870 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20871 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20872 vkDestroyBuffer(m_device->device(), buffer, NULL);
20873 vkFreeMemory(m_device->device(), mem, NULL);
20874
20875 m_errorMonitor->VerifyNotFound();
20876}
20877
Tony Barbourc46924f2016-11-04 11:49:52 -060020878TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020879 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20880
Tony Barbour1fa09702017-03-16 12:09:08 -060020881 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020882 VkEvent event;
20883 VkEventCreateInfo event_create_info{};
20884 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20885 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20886
20887 VkCommandPool command_pool;
20888 VkCommandPoolCreateInfo pool_create_info{};
20889 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20890 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20891 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20892 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20893
20894 VkCommandBuffer command_buffer;
20895 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20896 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20897 command_buffer_allocate_info.commandPool = command_pool;
20898 command_buffer_allocate_info.commandBufferCount = 1;
20899 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20900 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20901
20902 VkQueue queue = VK_NULL_HANDLE;
20903 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20904
20905 {
20906 VkCommandBufferBeginInfo begin_info{};
20907 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20908 vkBeginCommandBuffer(command_buffer, &begin_info);
20909
20910 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020911 vkEndCommandBuffer(command_buffer);
20912 }
20913 {
20914 VkSubmitInfo submit_info{};
20915 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20916 submit_info.commandBufferCount = 1;
20917 submit_info.pCommandBuffers = &command_buffer;
20918 submit_info.signalSemaphoreCount = 0;
20919 submit_info.pSignalSemaphores = nullptr;
20920 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20921 }
20922 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20924 "that is already in use by a "
20925 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020926 vkSetEvent(m_device->device(), event);
20927 m_errorMonitor->VerifyFound();
20928 }
20929
20930 vkQueueWaitIdle(queue);
20931
20932 vkDestroyEvent(m_device->device(), event, nullptr);
20933 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20934 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20935}
20936
20937// This is a positive test. No errors should be generated.
20938TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020939 TEST_DESCRIPTION(
20940 "Two command buffers with two separate fences are each "
20941 "run through a Submit & WaitForFences cycle 3 times. This "
20942 "previously revealed a bug so running this positive test "
20943 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020944 m_errorMonitor->ExpectSuccess();
20945
Tony Barbour1fa09702017-03-16 12:09:08 -060020946 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020947 VkQueue queue = VK_NULL_HANDLE;
20948 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20949
20950 static const uint32_t NUM_OBJECTS = 2;
20951 static const uint32_t NUM_FRAMES = 3;
20952 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20953 VkFence fences[NUM_OBJECTS] = {};
20954
20955 VkCommandPool cmd_pool;
20956 VkCommandPoolCreateInfo cmd_pool_ci = {};
20957 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20958 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20959 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20960 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20961 ASSERT_VK_SUCCESS(err);
20962
20963 VkCommandBufferAllocateInfo cmd_buf_info = {};
20964 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20965 cmd_buf_info.commandPool = cmd_pool;
20966 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20967 cmd_buf_info.commandBufferCount = 1;
20968
20969 VkFenceCreateInfo fence_ci = {};
20970 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20971 fence_ci.pNext = nullptr;
20972 fence_ci.flags = 0;
20973
20974 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20975 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20976 ASSERT_VK_SUCCESS(err);
20977 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20978 ASSERT_VK_SUCCESS(err);
20979 }
20980
20981 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20982 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20983 // Create empty cmd buffer
20984 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20985 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20986
20987 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20988 ASSERT_VK_SUCCESS(err);
20989 err = vkEndCommandBuffer(cmd_buffers[obj]);
20990 ASSERT_VK_SUCCESS(err);
20991
20992 VkSubmitInfo submit_info = {};
20993 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20994 submit_info.commandBufferCount = 1;
20995 submit_info.pCommandBuffers = &cmd_buffers[obj];
20996 // Submit cmd buffer and wait for fence
20997 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20998 ASSERT_VK_SUCCESS(err);
20999 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21000 ASSERT_VK_SUCCESS(err);
21001 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21002 ASSERT_VK_SUCCESS(err);
21003 }
21004 }
21005 m_errorMonitor->VerifyNotFound();
21006 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21007 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21008 vkDestroyFence(m_device->device(), fences[i], nullptr);
21009 }
21010}
21011// This is a positive test. No errors should be generated.
21012TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021013 TEST_DESCRIPTION(
21014 "Two command buffers, each in a separate QueueSubmit call "
21015 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021016
Tony Barbour1fa09702017-03-16 12:09:08 -060021017 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021018 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021019
21020 m_errorMonitor->ExpectSuccess();
21021
21022 VkSemaphore semaphore;
21023 VkSemaphoreCreateInfo semaphore_create_info{};
21024 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21025 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21026
21027 VkCommandPool command_pool;
21028 VkCommandPoolCreateInfo pool_create_info{};
21029 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21030 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21031 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21032 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21033
21034 VkCommandBuffer command_buffer[2];
21035 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21036 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21037 command_buffer_allocate_info.commandPool = command_pool;
21038 command_buffer_allocate_info.commandBufferCount = 2;
21039 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21040 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21041
21042 VkQueue queue = VK_NULL_HANDLE;
21043 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21044
21045 {
21046 VkCommandBufferBeginInfo begin_info{};
21047 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21048 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21049
21050 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 -070021051 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021052
21053 VkViewport viewport{};
21054 viewport.maxDepth = 1.0f;
21055 viewport.minDepth = 0.0f;
21056 viewport.width = 512;
21057 viewport.height = 512;
21058 viewport.x = 0;
21059 viewport.y = 0;
21060 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21061 vkEndCommandBuffer(command_buffer[0]);
21062 }
21063 {
21064 VkCommandBufferBeginInfo begin_info{};
21065 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21066 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21067
21068 VkViewport viewport{};
21069 viewport.maxDepth = 1.0f;
21070 viewport.minDepth = 0.0f;
21071 viewport.width = 512;
21072 viewport.height = 512;
21073 viewport.x = 0;
21074 viewport.y = 0;
21075 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21076 vkEndCommandBuffer(command_buffer[1]);
21077 }
21078 {
21079 VkSubmitInfo submit_info{};
21080 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21081 submit_info.commandBufferCount = 1;
21082 submit_info.pCommandBuffers = &command_buffer[0];
21083 submit_info.signalSemaphoreCount = 1;
21084 submit_info.pSignalSemaphores = &semaphore;
21085 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21086 }
21087 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021088 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021089 VkSubmitInfo submit_info{};
21090 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21091 submit_info.commandBufferCount = 1;
21092 submit_info.pCommandBuffers = &command_buffer[1];
21093 submit_info.waitSemaphoreCount = 1;
21094 submit_info.pWaitSemaphores = &semaphore;
21095 submit_info.pWaitDstStageMask = flags;
21096 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21097 }
21098
21099 vkQueueWaitIdle(m_device->m_queue);
21100
21101 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21102 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21103 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21104
21105 m_errorMonitor->VerifyNotFound();
21106}
21107
21108// This is a positive test. No errors should be generated.
21109TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021110 TEST_DESCRIPTION(
21111 "Two command buffers, each in a separate QueueSubmit call "
21112 "submitted on separate queues, the second having a fence"
21113 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021114
Tony Barbour1fa09702017-03-16 12:09:08 -060021115 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021116 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021117
21118 m_errorMonitor->ExpectSuccess();
21119
21120 VkFence fence;
21121 VkFenceCreateInfo fence_create_info{};
21122 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21123 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21124
21125 VkSemaphore semaphore;
21126 VkSemaphoreCreateInfo semaphore_create_info{};
21127 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21128 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21129
21130 VkCommandPool command_pool;
21131 VkCommandPoolCreateInfo pool_create_info{};
21132 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21133 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21134 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21135 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21136
21137 VkCommandBuffer command_buffer[2];
21138 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21139 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21140 command_buffer_allocate_info.commandPool = command_pool;
21141 command_buffer_allocate_info.commandBufferCount = 2;
21142 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21143 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21144
21145 VkQueue queue = VK_NULL_HANDLE;
21146 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21147
21148 {
21149 VkCommandBufferBeginInfo begin_info{};
21150 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21151 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21152
21153 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 -070021154 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021155
21156 VkViewport viewport{};
21157 viewport.maxDepth = 1.0f;
21158 viewport.minDepth = 0.0f;
21159 viewport.width = 512;
21160 viewport.height = 512;
21161 viewport.x = 0;
21162 viewport.y = 0;
21163 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21164 vkEndCommandBuffer(command_buffer[0]);
21165 }
21166 {
21167 VkCommandBufferBeginInfo begin_info{};
21168 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21169 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21170
21171 VkViewport viewport{};
21172 viewport.maxDepth = 1.0f;
21173 viewport.minDepth = 0.0f;
21174 viewport.width = 512;
21175 viewport.height = 512;
21176 viewport.x = 0;
21177 viewport.y = 0;
21178 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21179 vkEndCommandBuffer(command_buffer[1]);
21180 }
21181 {
21182 VkSubmitInfo submit_info{};
21183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21184 submit_info.commandBufferCount = 1;
21185 submit_info.pCommandBuffers = &command_buffer[0];
21186 submit_info.signalSemaphoreCount = 1;
21187 submit_info.pSignalSemaphores = &semaphore;
21188 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21189 }
21190 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021191 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021192 VkSubmitInfo submit_info{};
21193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21194 submit_info.commandBufferCount = 1;
21195 submit_info.pCommandBuffers = &command_buffer[1];
21196 submit_info.waitSemaphoreCount = 1;
21197 submit_info.pWaitSemaphores = &semaphore;
21198 submit_info.pWaitDstStageMask = flags;
21199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21200 }
21201
21202 vkQueueWaitIdle(m_device->m_queue);
21203
21204 vkDestroyFence(m_device->device(), fence, nullptr);
21205 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21206 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21207 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21208
21209 m_errorMonitor->VerifyNotFound();
21210}
21211
21212// This is a positive test. No errors should be generated.
21213TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021214 TEST_DESCRIPTION(
21215 "Two command buffers, each in a separate QueueSubmit call "
21216 "submitted on separate queues, the second having a fence"
21217 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021218
Tony Barbour1fa09702017-03-16 12:09:08 -060021219 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021220 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021221
21222 m_errorMonitor->ExpectSuccess();
21223
21224 VkFence fence;
21225 VkFenceCreateInfo fence_create_info{};
21226 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21227 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21228
21229 VkSemaphore semaphore;
21230 VkSemaphoreCreateInfo semaphore_create_info{};
21231 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21232 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21233
21234 VkCommandPool command_pool;
21235 VkCommandPoolCreateInfo pool_create_info{};
21236 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21237 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21238 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21239 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21240
21241 VkCommandBuffer command_buffer[2];
21242 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21243 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21244 command_buffer_allocate_info.commandPool = command_pool;
21245 command_buffer_allocate_info.commandBufferCount = 2;
21246 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21247 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21248
21249 VkQueue queue = VK_NULL_HANDLE;
21250 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21251
21252 {
21253 VkCommandBufferBeginInfo begin_info{};
21254 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21255 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21256
21257 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 -070021258 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021259
21260 VkViewport viewport{};
21261 viewport.maxDepth = 1.0f;
21262 viewport.minDepth = 0.0f;
21263 viewport.width = 512;
21264 viewport.height = 512;
21265 viewport.x = 0;
21266 viewport.y = 0;
21267 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21268 vkEndCommandBuffer(command_buffer[0]);
21269 }
21270 {
21271 VkCommandBufferBeginInfo begin_info{};
21272 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21273 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21274
21275 VkViewport viewport{};
21276 viewport.maxDepth = 1.0f;
21277 viewport.minDepth = 0.0f;
21278 viewport.width = 512;
21279 viewport.height = 512;
21280 viewport.x = 0;
21281 viewport.y = 0;
21282 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21283 vkEndCommandBuffer(command_buffer[1]);
21284 }
21285 {
21286 VkSubmitInfo submit_info{};
21287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21288 submit_info.commandBufferCount = 1;
21289 submit_info.pCommandBuffers = &command_buffer[0];
21290 submit_info.signalSemaphoreCount = 1;
21291 submit_info.pSignalSemaphores = &semaphore;
21292 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21293 }
21294 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021295 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021296 VkSubmitInfo submit_info{};
21297 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21298 submit_info.commandBufferCount = 1;
21299 submit_info.pCommandBuffers = &command_buffer[1];
21300 submit_info.waitSemaphoreCount = 1;
21301 submit_info.pWaitSemaphores = &semaphore;
21302 submit_info.pWaitDstStageMask = flags;
21303 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21304 }
21305
21306 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21307 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21308
21309 vkDestroyFence(m_device->device(), fence, nullptr);
21310 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21311 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21312 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21313
21314 m_errorMonitor->VerifyNotFound();
21315}
21316
21317TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021318 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021319 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021320 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021321 return;
21322 }
21323
21324 VkResult err;
21325
21326 m_errorMonitor->ExpectSuccess();
21327
21328 VkQueue q0 = m_device->m_queue;
21329 VkQueue q1 = nullptr;
21330 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21331 ASSERT_NE(q1, nullptr);
21332
21333 // An (empty) command buffer. We must have work in the first submission --
21334 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021335 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021336 VkCommandPool pool;
21337 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21338 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021339 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21340 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021341 VkCommandBuffer cb;
21342 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21343 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021344 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021345 err = vkBeginCommandBuffer(cb, &cbbi);
21346 ASSERT_VK_SUCCESS(err);
21347 err = vkEndCommandBuffer(cb);
21348 ASSERT_VK_SUCCESS(err);
21349
21350 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021351 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021352 VkSemaphore s;
21353 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21354 ASSERT_VK_SUCCESS(err);
21355
21356 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021357 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021358
21359 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21360 ASSERT_VK_SUCCESS(err);
21361
21362 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021363 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021364 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021365
21366 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21367 ASSERT_VK_SUCCESS(err);
21368
21369 // Wait for q0 idle
21370 err = vkQueueWaitIdle(q0);
21371 ASSERT_VK_SUCCESS(err);
21372
21373 // Command buffer should have been completed (it was on q0); reset the pool.
21374 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21375
21376 m_errorMonitor->VerifyNotFound();
21377
21378 // Force device completely idle and clean up resources
21379 vkDeviceWaitIdle(m_device->device());
21380 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21381 vkDestroySemaphore(m_device->device(), s, nullptr);
21382}
21383
21384// This is a positive test. No errors should be generated.
21385TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021386 TEST_DESCRIPTION(
21387 "Two command buffers, each in a separate QueueSubmit call "
21388 "submitted on separate queues, the second having a fence, "
21389 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021390
Tony Barbour1fa09702017-03-16 12:09:08 -060021391 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021392 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021393
21394 m_errorMonitor->ExpectSuccess();
21395
Tony Barbour1fa09702017-03-16 12:09:08 -060021396 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021397 VkFence fence;
21398 VkFenceCreateInfo fence_create_info{};
21399 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21400 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21401
21402 VkSemaphore semaphore;
21403 VkSemaphoreCreateInfo semaphore_create_info{};
21404 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21405 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21406
21407 VkCommandPool command_pool;
21408 VkCommandPoolCreateInfo pool_create_info{};
21409 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21410 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21411 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21412 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21413
21414 VkCommandBuffer command_buffer[2];
21415 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21416 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21417 command_buffer_allocate_info.commandPool = command_pool;
21418 command_buffer_allocate_info.commandBufferCount = 2;
21419 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21420 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21421
21422 VkQueue queue = VK_NULL_HANDLE;
21423 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21424
21425 {
21426 VkCommandBufferBeginInfo begin_info{};
21427 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21428 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21429
21430 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 -070021431 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021432
21433 VkViewport viewport{};
21434 viewport.maxDepth = 1.0f;
21435 viewport.minDepth = 0.0f;
21436 viewport.width = 512;
21437 viewport.height = 512;
21438 viewport.x = 0;
21439 viewport.y = 0;
21440 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21441 vkEndCommandBuffer(command_buffer[0]);
21442 }
21443 {
21444 VkCommandBufferBeginInfo begin_info{};
21445 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21446 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21447
21448 VkViewport viewport{};
21449 viewport.maxDepth = 1.0f;
21450 viewport.minDepth = 0.0f;
21451 viewport.width = 512;
21452 viewport.height = 512;
21453 viewport.x = 0;
21454 viewport.y = 0;
21455 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21456 vkEndCommandBuffer(command_buffer[1]);
21457 }
21458 {
21459 VkSubmitInfo submit_info{};
21460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21461 submit_info.commandBufferCount = 1;
21462 submit_info.pCommandBuffers = &command_buffer[0];
21463 submit_info.signalSemaphoreCount = 1;
21464 submit_info.pSignalSemaphores = &semaphore;
21465 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21466 }
21467 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021468 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021469 VkSubmitInfo submit_info{};
21470 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21471 submit_info.commandBufferCount = 1;
21472 submit_info.pCommandBuffers = &command_buffer[1];
21473 submit_info.waitSemaphoreCount = 1;
21474 submit_info.pWaitSemaphores = &semaphore;
21475 submit_info.pWaitDstStageMask = flags;
21476 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21477 }
21478
21479 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21480
21481 vkDestroyFence(m_device->device(), fence, nullptr);
21482 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21483 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21484 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21485
21486 m_errorMonitor->VerifyNotFound();
21487}
21488
21489// This is a positive test. No errors should be generated.
21490TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021491 TEST_DESCRIPTION(
21492 "Two command buffers, each in a separate QueueSubmit call "
21493 "on the same queue, sharing a signal/wait semaphore, the "
21494 "second having a fence, "
21495 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021496
21497 m_errorMonitor->ExpectSuccess();
21498
Tony Barbour1fa09702017-03-16 12:09:08 -060021499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021500 VkFence fence;
21501 VkFenceCreateInfo fence_create_info{};
21502 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21503 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21504
21505 VkSemaphore semaphore;
21506 VkSemaphoreCreateInfo semaphore_create_info{};
21507 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21508 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21509
21510 VkCommandPool command_pool;
21511 VkCommandPoolCreateInfo pool_create_info{};
21512 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21513 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21514 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21515 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21516
21517 VkCommandBuffer command_buffer[2];
21518 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21519 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21520 command_buffer_allocate_info.commandPool = command_pool;
21521 command_buffer_allocate_info.commandBufferCount = 2;
21522 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21523 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21524
21525 {
21526 VkCommandBufferBeginInfo begin_info{};
21527 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21528 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21529
21530 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 -070021531 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021532
21533 VkViewport viewport{};
21534 viewport.maxDepth = 1.0f;
21535 viewport.minDepth = 0.0f;
21536 viewport.width = 512;
21537 viewport.height = 512;
21538 viewport.x = 0;
21539 viewport.y = 0;
21540 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21541 vkEndCommandBuffer(command_buffer[0]);
21542 }
21543 {
21544 VkCommandBufferBeginInfo begin_info{};
21545 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21546 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21547
21548 VkViewport viewport{};
21549 viewport.maxDepth = 1.0f;
21550 viewport.minDepth = 0.0f;
21551 viewport.width = 512;
21552 viewport.height = 512;
21553 viewport.x = 0;
21554 viewport.y = 0;
21555 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21556 vkEndCommandBuffer(command_buffer[1]);
21557 }
21558 {
21559 VkSubmitInfo submit_info{};
21560 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21561 submit_info.commandBufferCount = 1;
21562 submit_info.pCommandBuffers = &command_buffer[0];
21563 submit_info.signalSemaphoreCount = 1;
21564 submit_info.pSignalSemaphores = &semaphore;
21565 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21566 }
21567 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021568 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021569 VkSubmitInfo submit_info{};
21570 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21571 submit_info.commandBufferCount = 1;
21572 submit_info.pCommandBuffers = &command_buffer[1];
21573 submit_info.waitSemaphoreCount = 1;
21574 submit_info.pWaitSemaphores = &semaphore;
21575 submit_info.pWaitDstStageMask = flags;
21576 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21577 }
21578
21579 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21580
21581 vkDestroyFence(m_device->device(), fence, nullptr);
21582 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21583 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21584 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21585
21586 m_errorMonitor->VerifyNotFound();
21587}
21588
21589// This is a positive test. No errors should be generated.
21590TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021591 TEST_DESCRIPTION(
21592 "Two command buffers, each in a separate QueueSubmit call "
21593 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21594 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021595
21596 m_errorMonitor->ExpectSuccess();
21597
Tony Barbour1fa09702017-03-16 12:09:08 -060021598 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021599 VkFence fence;
21600 VkFenceCreateInfo fence_create_info{};
21601 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21602 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21603
21604 VkCommandPool command_pool;
21605 VkCommandPoolCreateInfo pool_create_info{};
21606 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21607 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21608 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21609 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21610
21611 VkCommandBuffer command_buffer[2];
21612 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21613 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21614 command_buffer_allocate_info.commandPool = command_pool;
21615 command_buffer_allocate_info.commandBufferCount = 2;
21616 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21617 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21618
21619 {
21620 VkCommandBufferBeginInfo begin_info{};
21621 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21622 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21623
21624 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 -070021625 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021626
21627 VkViewport viewport{};
21628 viewport.maxDepth = 1.0f;
21629 viewport.minDepth = 0.0f;
21630 viewport.width = 512;
21631 viewport.height = 512;
21632 viewport.x = 0;
21633 viewport.y = 0;
21634 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21635 vkEndCommandBuffer(command_buffer[0]);
21636 }
21637 {
21638 VkCommandBufferBeginInfo begin_info{};
21639 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21640 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21641
21642 VkViewport viewport{};
21643 viewport.maxDepth = 1.0f;
21644 viewport.minDepth = 0.0f;
21645 viewport.width = 512;
21646 viewport.height = 512;
21647 viewport.x = 0;
21648 viewport.y = 0;
21649 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21650 vkEndCommandBuffer(command_buffer[1]);
21651 }
21652 {
21653 VkSubmitInfo submit_info{};
21654 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21655 submit_info.commandBufferCount = 1;
21656 submit_info.pCommandBuffers = &command_buffer[0];
21657 submit_info.signalSemaphoreCount = 0;
21658 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21659 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21660 }
21661 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021662 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021663 VkSubmitInfo submit_info{};
21664 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21665 submit_info.commandBufferCount = 1;
21666 submit_info.pCommandBuffers = &command_buffer[1];
21667 submit_info.waitSemaphoreCount = 0;
21668 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21669 submit_info.pWaitDstStageMask = flags;
21670 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21671 }
21672
21673 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21674
21675 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21676 ASSERT_VK_SUCCESS(err);
21677
21678 vkDestroyFence(m_device->device(), fence, nullptr);
21679 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21680 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21681
21682 m_errorMonitor->VerifyNotFound();
21683}
21684
21685// This is a positive test. No errors should be generated.
21686TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021687 TEST_DESCRIPTION(
21688 "Two command buffers, each in a separate QueueSubmit call "
21689 "on the same queue, the second having a fence, followed "
21690 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021691
21692 m_errorMonitor->ExpectSuccess();
21693
Tony Barbour1fa09702017-03-16 12:09:08 -060021694 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021695 VkFence fence;
21696 VkFenceCreateInfo fence_create_info{};
21697 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21698 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21699
21700 VkCommandPool command_pool;
21701 VkCommandPoolCreateInfo pool_create_info{};
21702 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21703 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21704 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21705 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21706
21707 VkCommandBuffer command_buffer[2];
21708 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21709 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21710 command_buffer_allocate_info.commandPool = command_pool;
21711 command_buffer_allocate_info.commandBufferCount = 2;
21712 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21713 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21714
21715 {
21716 VkCommandBufferBeginInfo begin_info{};
21717 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21718 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21719
21720 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 -070021721 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021722
21723 VkViewport viewport{};
21724 viewport.maxDepth = 1.0f;
21725 viewport.minDepth = 0.0f;
21726 viewport.width = 512;
21727 viewport.height = 512;
21728 viewport.x = 0;
21729 viewport.y = 0;
21730 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21731 vkEndCommandBuffer(command_buffer[0]);
21732 }
21733 {
21734 VkCommandBufferBeginInfo begin_info{};
21735 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21736 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21737
21738 VkViewport viewport{};
21739 viewport.maxDepth = 1.0f;
21740 viewport.minDepth = 0.0f;
21741 viewport.width = 512;
21742 viewport.height = 512;
21743 viewport.x = 0;
21744 viewport.y = 0;
21745 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21746 vkEndCommandBuffer(command_buffer[1]);
21747 }
21748 {
21749 VkSubmitInfo submit_info{};
21750 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21751 submit_info.commandBufferCount = 1;
21752 submit_info.pCommandBuffers = &command_buffer[0];
21753 submit_info.signalSemaphoreCount = 0;
21754 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21755 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21756 }
21757 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021758 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021759 VkSubmitInfo submit_info{};
21760 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21761 submit_info.commandBufferCount = 1;
21762 submit_info.pCommandBuffers = &command_buffer[1];
21763 submit_info.waitSemaphoreCount = 0;
21764 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21765 submit_info.pWaitDstStageMask = flags;
21766 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21767 }
21768
21769 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21770
21771 vkDestroyFence(m_device->device(), fence, nullptr);
21772 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21773 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21774
21775 m_errorMonitor->VerifyNotFound();
21776}
21777
21778// This is a positive test. No errors should be generated.
21779TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021780 TEST_DESCRIPTION(
21781 "Two command buffers each in a separate SubmitInfo sent in a single "
21782 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021783 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021784
21785 m_errorMonitor->ExpectSuccess();
21786
21787 VkFence fence;
21788 VkFenceCreateInfo fence_create_info{};
21789 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21790 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21791
21792 VkSemaphore semaphore;
21793 VkSemaphoreCreateInfo semaphore_create_info{};
21794 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21795 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21796
21797 VkCommandPool command_pool;
21798 VkCommandPoolCreateInfo pool_create_info{};
21799 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21800 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21801 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21802 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21803
21804 VkCommandBuffer command_buffer[2];
21805 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21806 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21807 command_buffer_allocate_info.commandPool = command_pool;
21808 command_buffer_allocate_info.commandBufferCount = 2;
21809 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21810 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21811
21812 {
21813 VkCommandBufferBeginInfo begin_info{};
21814 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21815 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21816
21817 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 -070021818 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021819
21820 VkViewport viewport{};
21821 viewport.maxDepth = 1.0f;
21822 viewport.minDepth = 0.0f;
21823 viewport.width = 512;
21824 viewport.height = 512;
21825 viewport.x = 0;
21826 viewport.y = 0;
21827 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21828 vkEndCommandBuffer(command_buffer[0]);
21829 }
21830 {
21831 VkCommandBufferBeginInfo begin_info{};
21832 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21833 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21834
21835 VkViewport viewport{};
21836 viewport.maxDepth = 1.0f;
21837 viewport.minDepth = 0.0f;
21838 viewport.width = 512;
21839 viewport.height = 512;
21840 viewport.x = 0;
21841 viewport.y = 0;
21842 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21843 vkEndCommandBuffer(command_buffer[1]);
21844 }
21845 {
21846 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021847 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021848
21849 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21850 submit_info[0].pNext = NULL;
21851 submit_info[0].commandBufferCount = 1;
21852 submit_info[0].pCommandBuffers = &command_buffer[0];
21853 submit_info[0].signalSemaphoreCount = 1;
21854 submit_info[0].pSignalSemaphores = &semaphore;
21855 submit_info[0].waitSemaphoreCount = 0;
21856 submit_info[0].pWaitSemaphores = NULL;
21857 submit_info[0].pWaitDstStageMask = 0;
21858
21859 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21860 submit_info[1].pNext = NULL;
21861 submit_info[1].commandBufferCount = 1;
21862 submit_info[1].pCommandBuffers = &command_buffer[1];
21863 submit_info[1].waitSemaphoreCount = 1;
21864 submit_info[1].pWaitSemaphores = &semaphore;
21865 submit_info[1].pWaitDstStageMask = flags;
21866 submit_info[1].signalSemaphoreCount = 0;
21867 submit_info[1].pSignalSemaphores = NULL;
21868 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21869 }
21870
21871 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21872
21873 vkDestroyFence(m_device->device(), fence, nullptr);
21874 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21875 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21876 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21877
21878 m_errorMonitor->VerifyNotFound();
21879}
21880
21881TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21882 m_errorMonitor->ExpectSuccess();
21883
Tony Barbour1fa09702017-03-16 12:09:08 -060021884 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21886
Tony Barbour552f6c02016-12-21 14:34:07 -070021887 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021888
21889 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21890 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21891 m_errorMonitor->VerifyNotFound();
21892 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21893 m_errorMonitor->VerifyNotFound();
21894 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21895 m_errorMonitor->VerifyNotFound();
21896
21897 m_commandBuffer->EndCommandBuffer();
21898 m_errorMonitor->VerifyNotFound();
21899}
21900
21901TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021902 TEST_DESCRIPTION(
21903 "Positive test where we create a renderpass with an "
21904 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21905 "has a valid layout, and a second subpass then uses a "
21906 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021907 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021908 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021909 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021910 if (!depth_format) {
21911 printf(" No Depth + Stencil format found. Skipped.\n");
21912 return;
21913 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021914
21915 VkAttachmentReference attach[2] = {};
21916 attach[0].attachment = 0;
21917 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21918 attach[1].attachment = 0;
21919 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21920 VkSubpassDescription subpasses[2] = {};
21921 // First subpass clears DS attach on load
21922 subpasses[0].pDepthStencilAttachment = &attach[0];
21923 // 2nd subpass reads in DS as input attachment
21924 subpasses[1].inputAttachmentCount = 1;
21925 subpasses[1].pInputAttachments = &attach[1];
21926 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021927 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021928 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21929 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21930 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21931 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21932 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21933 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21934 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21935 VkRenderPassCreateInfo rpci = {};
21936 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21937 rpci.attachmentCount = 1;
21938 rpci.pAttachments = &attach_desc;
21939 rpci.subpassCount = 2;
21940 rpci.pSubpasses = subpasses;
21941
21942 // Now create RenderPass and verify no errors
21943 VkRenderPass rp;
21944 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21945 m_errorMonitor->VerifyNotFound();
21946
21947 vkDestroyRenderPass(m_device->device(), rp, NULL);
21948}
21949
Tobin Ehlis01103de2017-02-16 13:22:47 -070021950TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21951 TEST_DESCRIPTION(
21952 "Create a render pass with depth-stencil attachment where layout transition "
21953 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21954 "transition has correctly occurred at queue submit time with no validation errors.");
21955
Tony Barbour1fa09702017-03-16 12:09:08 -060021956 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021957 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021958 if (!depth_format) {
21959 printf(" No Depth + Stencil format found. Skipped.\n");
21960 return;
21961 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021962 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021963 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021964 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21965 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021966 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021967 return;
21968 }
21969
21970 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21972
21973 // A renderpass with one depth/stencil attachment.
21974 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021975 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021976 VK_SAMPLE_COUNT_1_BIT,
21977 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21978 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21979 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21980 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21981 VK_IMAGE_LAYOUT_UNDEFINED,
21982 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21983
21984 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21985
21986 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21987
21988 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21989
21990 VkRenderPass rp;
21991 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21992 ASSERT_VK_SUCCESS(err);
21993 // A compatible ds image.
21994 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021995 image.init(32, 32, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis01103de2017-02-16 13:22:47 -070021996 ASSERT_TRUE(image.initialized());
21997
21998 VkImageViewCreateInfo ivci = {
21999 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22000 nullptr,
22001 0,
22002 image.handle(),
22003 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022004 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022005 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22006 VK_COMPONENT_SWIZZLE_IDENTITY},
22007 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22008 };
22009 VkImageView view;
22010 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22011 ASSERT_VK_SUCCESS(err);
22012
22013 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22014 VkFramebuffer fb;
22015 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22016 ASSERT_VK_SUCCESS(err);
22017
22018 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22019 m_commandBuffer->BeginCommandBuffer();
22020 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22021 vkCmdEndRenderPass(m_commandBuffer->handle());
22022 m_commandBuffer->EndCommandBuffer();
22023 QueueCommandBuffer(false);
22024 m_errorMonitor->VerifyNotFound();
22025
22026 // Cleanup
22027 vkDestroyImageView(m_device->device(), view, NULL);
22028 vkDestroyRenderPass(m_device->device(), rp, NULL);
22029 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22030}
22031
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022032TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022033 TEST_DESCRIPTION(
22034 "Test that pipeline validation accepts matrices passed "
22035 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022036 m_errorMonitor->ExpectSuccess();
22037
Tony Barbour1fa09702017-03-16 12:09:08 -060022038 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22040
22041 VkVertexInputBindingDescription input_binding;
22042 memset(&input_binding, 0, sizeof(input_binding));
22043
22044 VkVertexInputAttributeDescription input_attribs[2];
22045 memset(input_attribs, 0, sizeof(input_attribs));
22046
22047 for (int i = 0; i < 2; i++) {
22048 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22049 input_attribs[i].location = i;
22050 }
22051
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022052 char const *vsSource =
22053 "#version 450\n"
22054 "\n"
22055 "layout(location=0) in mat2x4 x;\n"
22056 "out gl_PerVertex {\n"
22057 " vec4 gl_Position;\n"
22058 "};\n"
22059 "void main(){\n"
22060 " gl_Position = x[0] + x[1];\n"
22061 "}\n";
22062 char const *fsSource =
22063 "#version 450\n"
22064 "\n"
22065 "layout(location=0) out vec4 color;\n"
22066 "void main(){\n"
22067 " color = vec4(1);\n"
22068 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022069
22070 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22071 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22072
22073 VkPipelineObj pipe(m_device);
22074 pipe.AddColorAttachment();
22075 pipe.AddShader(&vs);
22076 pipe.AddShader(&fs);
22077
22078 pipe.AddVertexInputBindings(&input_binding, 1);
22079 pipe.AddVertexInputAttribs(input_attribs, 2);
22080
22081 VkDescriptorSetObj descriptorSet(m_device);
22082 descriptorSet.AppendDummy();
22083 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22084
22085 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22086
22087 /* expect success */
22088 m_errorMonitor->VerifyNotFound();
22089}
22090
22091TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22092 m_errorMonitor->ExpectSuccess();
22093
Tony Barbour1fa09702017-03-16 12:09:08 -060022094 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22096
22097 VkVertexInputBindingDescription input_binding;
22098 memset(&input_binding, 0, sizeof(input_binding));
22099
22100 VkVertexInputAttributeDescription input_attribs[2];
22101 memset(input_attribs, 0, sizeof(input_attribs));
22102
22103 for (int i = 0; i < 2; i++) {
22104 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22105 input_attribs[i].location = i;
22106 }
22107
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022108 char const *vsSource =
22109 "#version 450\n"
22110 "\n"
22111 "layout(location=0) in vec4 x[2];\n"
22112 "out gl_PerVertex {\n"
22113 " vec4 gl_Position;\n"
22114 "};\n"
22115 "void main(){\n"
22116 " gl_Position = x[0] + x[1];\n"
22117 "}\n";
22118 char const *fsSource =
22119 "#version 450\n"
22120 "\n"
22121 "layout(location=0) out vec4 color;\n"
22122 "void main(){\n"
22123 " color = vec4(1);\n"
22124 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022125
22126 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22127 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22128
22129 VkPipelineObj pipe(m_device);
22130 pipe.AddColorAttachment();
22131 pipe.AddShader(&vs);
22132 pipe.AddShader(&fs);
22133
22134 pipe.AddVertexInputBindings(&input_binding, 1);
22135 pipe.AddVertexInputAttribs(input_attribs, 2);
22136
22137 VkDescriptorSetObj descriptorSet(m_device);
22138 descriptorSet.AppendDummy();
22139 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22140
22141 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22142
22143 m_errorMonitor->VerifyNotFound();
22144}
22145
22146TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022147 TEST_DESCRIPTION(
22148 "Test that pipeline validation accepts consuming a vertex attribute "
22149 "through multiple vertex shader inputs, each consuming a different "
22150 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022151 m_errorMonitor->ExpectSuccess();
22152
Tony Barbour1fa09702017-03-16 12:09:08 -060022153 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22155
22156 VkVertexInputBindingDescription input_binding;
22157 memset(&input_binding, 0, sizeof(input_binding));
22158
22159 VkVertexInputAttributeDescription input_attribs[3];
22160 memset(input_attribs, 0, sizeof(input_attribs));
22161
22162 for (int i = 0; i < 3; i++) {
22163 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22164 input_attribs[i].location = i;
22165 }
22166
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022167 char const *vsSource =
22168 "#version 450\n"
22169 "\n"
22170 "layout(location=0) in vec4 x;\n"
22171 "layout(location=1) in vec3 y1;\n"
22172 "layout(location=1, component=3) in float y2;\n"
22173 "layout(location=2) in vec4 z;\n"
22174 "out gl_PerVertex {\n"
22175 " vec4 gl_Position;\n"
22176 "};\n"
22177 "void main(){\n"
22178 " gl_Position = x + vec4(y1, y2) + z;\n"
22179 "}\n";
22180 char const *fsSource =
22181 "#version 450\n"
22182 "\n"
22183 "layout(location=0) out vec4 color;\n"
22184 "void main(){\n"
22185 " color = vec4(1);\n"
22186 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022187
22188 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22189 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22190
22191 VkPipelineObj pipe(m_device);
22192 pipe.AddColorAttachment();
22193 pipe.AddShader(&vs);
22194 pipe.AddShader(&fs);
22195
22196 pipe.AddVertexInputBindings(&input_binding, 1);
22197 pipe.AddVertexInputAttribs(input_attribs, 3);
22198
22199 VkDescriptorSetObj descriptorSet(m_device);
22200 descriptorSet.AppendDummy();
22201 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22202
22203 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22204
22205 m_errorMonitor->VerifyNotFound();
22206}
22207
22208TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22209 m_errorMonitor->ExpectSuccess();
22210
Tony Barbour1fa09702017-03-16 12:09:08 -060022211 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22213
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022214 char const *vsSource =
22215 "#version 450\n"
22216 "out gl_PerVertex {\n"
22217 " vec4 gl_Position;\n"
22218 "};\n"
22219 "void main(){\n"
22220 " gl_Position = vec4(0);\n"
22221 "}\n";
22222 char const *fsSource =
22223 "#version 450\n"
22224 "\n"
22225 "layout(location=0) out vec4 color;\n"
22226 "void main(){\n"
22227 " color = vec4(1);\n"
22228 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022229
22230 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22231 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22232
22233 VkPipelineObj pipe(m_device);
22234 pipe.AddColorAttachment();
22235 pipe.AddShader(&vs);
22236 pipe.AddShader(&fs);
22237
22238 VkDescriptorSetObj descriptorSet(m_device);
22239 descriptorSet.AppendDummy();
22240 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22241
22242 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22243
22244 m_errorMonitor->VerifyNotFound();
22245}
22246
22247TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022248 TEST_DESCRIPTION(
22249 "Test that pipeline validation accepts the relaxed type matching rules "
22250 "set out in 14.1.3: fundamental type must match, and producer side must "
22251 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022252 m_errorMonitor->ExpectSuccess();
22253
22254 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22255
Tony Barbour1fa09702017-03-16 12:09:08 -060022256 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22258
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022259 char const *vsSource =
22260 "#version 450\n"
22261 "out gl_PerVertex {\n"
22262 " vec4 gl_Position;\n"
22263 "};\n"
22264 "layout(location=0) out vec3 x;\n"
22265 "layout(location=1) out ivec3 y;\n"
22266 "layout(location=2) out vec3 z;\n"
22267 "void main(){\n"
22268 " gl_Position = vec4(0);\n"
22269 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22270 "}\n";
22271 char const *fsSource =
22272 "#version 450\n"
22273 "\n"
22274 "layout(location=0) out vec4 color;\n"
22275 "layout(location=0) in float x;\n"
22276 "layout(location=1) flat in int y;\n"
22277 "layout(location=2) in vec2 z;\n"
22278 "void main(){\n"
22279 " color = vec4(1 + x + y + z.x);\n"
22280 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022281
22282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22284
22285 VkPipelineObj pipe(m_device);
22286 pipe.AddColorAttachment();
22287 pipe.AddShader(&vs);
22288 pipe.AddShader(&fs);
22289
22290 VkDescriptorSetObj descriptorSet(m_device);
22291 descriptorSet.AppendDummy();
22292 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22293
22294 VkResult err = VK_SUCCESS;
22295 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22296 ASSERT_VK_SUCCESS(err);
22297
22298 m_errorMonitor->VerifyNotFound();
22299}
22300
22301TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022302 TEST_DESCRIPTION(
22303 "Test that pipeline validation accepts per-vertex variables "
22304 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022305 m_errorMonitor->ExpectSuccess();
22306
Tony Barbour1fa09702017-03-16 12:09:08 -060022307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22309
22310 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022311 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022312 return;
22313 }
22314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022315 char const *vsSource =
22316 "#version 450\n"
22317 "void main(){}\n";
22318 char const *tcsSource =
22319 "#version 450\n"
22320 "layout(location=0) out int x[];\n"
22321 "layout(vertices=3) out;\n"
22322 "void main(){\n"
22323 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22324 " gl_TessLevelInner[0] = 1;\n"
22325 " x[gl_InvocationID] = gl_InvocationID;\n"
22326 "}\n";
22327 char const *tesSource =
22328 "#version 450\n"
22329 "layout(triangles, equal_spacing, cw) in;\n"
22330 "layout(location=0) in int x[];\n"
22331 "out gl_PerVertex { vec4 gl_Position; };\n"
22332 "void main(){\n"
22333 " gl_Position.xyz = gl_TessCoord;\n"
22334 " gl_Position.w = x[0] + x[1] + x[2];\n"
22335 "}\n";
22336 char const *fsSource =
22337 "#version 450\n"
22338 "layout(location=0) out vec4 color;\n"
22339 "void main(){\n"
22340 " color = vec4(1);\n"
22341 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022342
22343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22344 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22345 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22346 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22347
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022348 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22349 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022350
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022351 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022352
22353 VkPipelineObj pipe(m_device);
22354 pipe.SetInputAssembly(&iasci);
22355 pipe.SetTessellation(&tsci);
22356 pipe.AddColorAttachment();
22357 pipe.AddShader(&vs);
22358 pipe.AddShader(&tcs);
22359 pipe.AddShader(&tes);
22360 pipe.AddShader(&fs);
22361
22362 VkDescriptorSetObj descriptorSet(m_device);
22363 descriptorSet.AppendDummy();
22364 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22365
22366 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22367
22368 m_errorMonitor->VerifyNotFound();
22369}
22370
22371TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022372 TEST_DESCRIPTION(
22373 "Test that pipeline validation accepts a user-defined "
22374 "interface block passed into the geometry shader. This "
22375 "is interesting because the 'extra' array level is not "
22376 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022377 m_errorMonitor->ExpectSuccess();
22378
Tony Barbour1fa09702017-03-16 12:09:08 -060022379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22381
22382 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022383 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022384 return;
22385 }
22386
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022387 char const *vsSource =
22388 "#version 450\n"
22389 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22390 "void main(){\n"
22391 " vs_out.x = vec4(1);\n"
22392 "}\n";
22393 char const *gsSource =
22394 "#version 450\n"
22395 "layout(triangles) in;\n"
22396 "layout(triangle_strip, max_vertices=3) out;\n"
22397 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22398 "out gl_PerVertex { vec4 gl_Position; };\n"
22399 "void main() {\n"
22400 " gl_Position = gs_in[0].x;\n"
22401 " EmitVertex();\n"
22402 "}\n";
22403 char const *fsSource =
22404 "#version 450\n"
22405 "layout(location=0) out vec4 color;\n"
22406 "void main(){\n"
22407 " color = vec4(1);\n"
22408 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022409
22410 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22411 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22413
22414 VkPipelineObj pipe(m_device);
22415 pipe.AddColorAttachment();
22416 pipe.AddShader(&vs);
22417 pipe.AddShader(&gs);
22418 pipe.AddShader(&fs);
22419
22420 VkDescriptorSetObj descriptorSet(m_device);
22421 descriptorSet.AppendDummy();
22422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22423
22424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22425
22426 m_errorMonitor->VerifyNotFound();
22427}
22428
22429TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022430 TEST_DESCRIPTION(
22431 "Test that pipeline validation accepts basic use of 64bit vertex "
22432 "attributes. This is interesting because they consume multiple "
22433 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022434 m_errorMonitor->ExpectSuccess();
22435
Tony Barbour1fa09702017-03-16 12:09:08 -060022436 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22438
22439 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022440 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022441 return;
22442 }
22443
22444 VkVertexInputBindingDescription input_bindings[1];
22445 memset(input_bindings, 0, sizeof(input_bindings));
22446
22447 VkVertexInputAttributeDescription input_attribs[4];
22448 memset(input_attribs, 0, sizeof(input_attribs));
22449 input_attribs[0].location = 0;
22450 input_attribs[0].offset = 0;
22451 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22452 input_attribs[1].location = 2;
22453 input_attribs[1].offset = 32;
22454 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22455 input_attribs[2].location = 4;
22456 input_attribs[2].offset = 64;
22457 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22458 input_attribs[3].location = 6;
22459 input_attribs[3].offset = 96;
22460 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22461
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022462 char const *vsSource =
22463 "#version 450\n"
22464 "\n"
22465 "layout(location=0) in dmat4 x;\n"
22466 "out gl_PerVertex {\n"
22467 " vec4 gl_Position;\n"
22468 "};\n"
22469 "void main(){\n"
22470 " gl_Position = vec4(x[0][0]);\n"
22471 "}\n";
22472 char const *fsSource =
22473 "#version 450\n"
22474 "\n"
22475 "layout(location=0) out vec4 color;\n"
22476 "void main(){\n"
22477 " color = vec4(1);\n"
22478 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022479
22480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22481 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22482
22483 VkPipelineObj pipe(m_device);
22484 pipe.AddColorAttachment();
22485 pipe.AddShader(&vs);
22486 pipe.AddShader(&fs);
22487
22488 pipe.AddVertexInputBindings(input_bindings, 1);
22489 pipe.AddVertexInputAttribs(input_attribs, 4);
22490
22491 VkDescriptorSetObj descriptorSet(m_device);
22492 descriptorSet.AppendDummy();
22493 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22494
22495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22496
22497 m_errorMonitor->VerifyNotFound();
22498}
22499
22500TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22501 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22502 m_errorMonitor->ExpectSuccess();
22503
Tony Barbour1fa09702017-03-16 12:09:08 -060022504 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022506 char const *vsSource =
22507 "#version 450\n"
22508 "\n"
22509 "out gl_PerVertex {\n"
22510 " vec4 gl_Position;\n"
22511 "};\n"
22512 "void main(){\n"
22513 " gl_Position = vec4(1);\n"
22514 "}\n";
22515 char const *fsSource =
22516 "#version 450\n"
22517 "\n"
22518 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22519 "layout(location=0) out vec4 color;\n"
22520 "void main() {\n"
22521 " color = subpassLoad(x);\n"
22522 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022523
22524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22526
22527 VkPipelineObj pipe(m_device);
22528 pipe.AddShader(&vs);
22529 pipe.AddShader(&fs);
22530 pipe.AddColorAttachment();
22531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22532
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022533 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22534 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022535 VkDescriptorSetLayout dsl;
22536 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22537 ASSERT_VK_SUCCESS(err);
22538
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022539 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022540 VkPipelineLayout pl;
22541 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22542 ASSERT_VK_SUCCESS(err);
22543
22544 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022545 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22546 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22547 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22548 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22549 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 -060022550 };
22551 VkAttachmentReference color = {
22552 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22553 };
22554 VkAttachmentReference input = {
22555 1, VK_IMAGE_LAYOUT_GENERAL,
22556 };
22557
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022558 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022560 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022561 VkRenderPass rp;
22562 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22563 ASSERT_VK_SUCCESS(err);
22564
22565 // should be OK. would go wrong here if it's going to...
22566 pipe.CreateVKPipeline(pl, rp);
22567
22568 m_errorMonitor->VerifyNotFound();
22569
22570 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22571 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22572 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22573}
22574
22575TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022576 TEST_DESCRIPTION(
22577 "Test that pipeline validation accepts a compute pipeline which declares a "
22578 "descriptor-backed resource which is not provided, but the shader does not "
22579 "statically use it. This is interesting because it requires compute pipelines "
22580 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022581 m_errorMonitor->ExpectSuccess();
22582
Tony Barbour1fa09702017-03-16 12:09:08 -060022583 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022584
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022585 char const *csSource =
22586 "#version 450\n"
22587 "\n"
22588 "layout(local_size_x=1) in;\n"
22589 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22590 "void main(){\n"
22591 " // x is not used.\n"
22592 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022593
22594 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22595
22596 VkDescriptorSetObj descriptorSet(m_device);
22597 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22598
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022599 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22600 nullptr,
22601 0,
22602 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22603 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22604 descriptorSet.GetPipelineLayout(),
22605 VK_NULL_HANDLE,
22606 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022607
22608 VkPipeline pipe;
22609 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22610
22611 m_errorMonitor->VerifyNotFound();
22612
22613 if (err == VK_SUCCESS) {
22614 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22615 }
22616}
22617
22618TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022619 TEST_DESCRIPTION(
22620 "Test that pipeline validation accepts a shader consuming only the "
22621 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022622 m_errorMonitor->ExpectSuccess();
22623
Tony Barbour1fa09702017-03-16 12:09:08 -060022624 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022625
22626 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022627 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22628 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22629 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022630 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022631 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022632 VkDescriptorSetLayout dsl;
22633 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22634 ASSERT_VK_SUCCESS(err);
22635
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022636 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022637 VkPipelineLayout pl;
22638 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22639 ASSERT_VK_SUCCESS(err);
22640
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022641 char const *csSource =
22642 "#version 450\n"
22643 "\n"
22644 "layout(local_size_x=1) in;\n"
22645 "layout(set=0, binding=0) uniform sampler s;\n"
22646 "layout(set=0, binding=1) uniform texture2D t;\n"
22647 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22648 "void main() {\n"
22649 " x = texture(sampler2D(t, s), vec2(0));\n"
22650 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022651 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22652
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022653 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22654 nullptr,
22655 0,
22656 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22657 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22658 pl,
22659 VK_NULL_HANDLE,
22660 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022661
22662 VkPipeline pipe;
22663 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22664
22665 m_errorMonitor->VerifyNotFound();
22666
22667 if (err == VK_SUCCESS) {
22668 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22669 }
22670
22671 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22672 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22673}
22674
22675TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022676 TEST_DESCRIPTION(
22677 "Test that pipeline validation accepts a shader consuming only the "
22678 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022679 m_errorMonitor->ExpectSuccess();
22680
Tony Barbour1fa09702017-03-16 12:09:08 -060022681 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022682
22683 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022684 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22685 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22686 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022687 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022688 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022689 VkDescriptorSetLayout dsl;
22690 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22691 ASSERT_VK_SUCCESS(err);
22692
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022693 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022694 VkPipelineLayout pl;
22695 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22696 ASSERT_VK_SUCCESS(err);
22697
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022698 char const *csSource =
22699 "#version 450\n"
22700 "\n"
22701 "layout(local_size_x=1) in;\n"
22702 "layout(set=0, binding=0) uniform texture2D t;\n"
22703 "layout(set=0, binding=1) uniform sampler s;\n"
22704 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22705 "void main() {\n"
22706 " x = texture(sampler2D(t, s), vec2(0));\n"
22707 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022708 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22709
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022710 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22711 nullptr,
22712 0,
22713 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22714 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22715 pl,
22716 VK_NULL_HANDLE,
22717 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022718
22719 VkPipeline pipe;
22720 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22721
22722 m_errorMonitor->VerifyNotFound();
22723
22724 if (err == VK_SUCCESS) {
22725 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22726 }
22727
22728 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22729 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22730}
22731
22732TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022733 TEST_DESCRIPTION(
22734 "Test that pipeline validation accepts a shader consuming "
22735 "both the sampler and the image of a combined image+sampler "
22736 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022737 m_errorMonitor->ExpectSuccess();
22738
Tony Barbour1fa09702017-03-16 12:09:08 -060022739 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022740
22741 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022742 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22743 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022744 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022745 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022746 VkDescriptorSetLayout dsl;
22747 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22748 ASSERT_VK_SUCCESS(err);
22749
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022750 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022751 VkPipelineLayout pl;
22752 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22753 ASSERT_VK_SUCCESS(err);
22754
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022755 char const *csSource =
22756 "#version 450\n"
22757 "\n"
22758 "layout(local_size_x=1) in;\n"
22759 "layout(set=0, binding=0) uniform texture2D t;\n"
22760 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22761 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22762 "void main() {\n"
22763 " x = texture(sampler2D(t, s), vec2(0));\n"
22764 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022765 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22766
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022767 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22768 nullptr,
22769 0,
22770 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22771 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22772 pl,
22773 VK_NULL_HANDLE,
22774 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022775
22776 VkPipeline pipe;
22777 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22778
22779 m_errorMonitor->VerifyNotFound();
22780
22781 if (err == VK_SUCCESS) {
22782 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22783 }
22784
22785 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22786 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22787}
22788
Tony Barbour3ed87a02017-03-15 16:19:02 -060022789TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022790 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22791
Tony Barbour3ed87a02017-03-15 16:19:02 -060022792 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022793 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022794
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022795 // Ensure that extension is available and enabled.
22796 uint32_t extension_count = 0;
22797 bool supports_maintenance1_extension = false;
22798 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22799 ASSERT_VK_SUCCESS(err);
22800 if (extension_count > 0) {
22801 std::vector<VkExtensionProperties> available_extensions(extension_count);
22802
22803 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22804 ASSERT_VK_SUCCESS(err);
22805 for (const auto &extension_props : available_extensions) {
22806 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22807 supports_maintenance1_extension = true;
22808 }
22809 }
22810 }
22811
22812 // Proceed if extension is supported by hardware
22813 if (!supports_maintenance1_extension) {
22814 printf(" Maintenance1 Extension not supported, skipping tests\n");
22815 return;
22816 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022817
22818 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022819 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022820 VkCommandBuffer cmd_buf;
22821 VkCommandBufferAllocateInfo alloc_info;
22822 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22823 alloc_info.pNext = NULL;
22824 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022825 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022826 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22827 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22828
22829 VkCommandBufferBeginInfo cb_binfo;
22830 cb_binfo.pNext = NULL;
22831 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22832 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22833 cb_binfo.flags = 0;
22834 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22835 // Set Negative height, should give error if Maintenance 1 is not enabled
22836 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22837 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22838 vkEndCommandBuffer(cmd_buf);
22839
22840 m_errorMonitor->VerifyNotFound();
22841}
22842
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022843TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22844 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22845
22846 ASSERT_NO_FATAL_FAILURE(Init());
22847
22848 uint32_t extension_count = 0;
22849 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22850 ASSERT_VK_SUCCESS(err);
22851
22852 if (extension_count > 0) {
22853 std::vector<VkExtensionProperties> available_extensions(extension_count);
22854 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22855 ASSERT_VK_SUCCESS(err);
22856
22857 for (const auto &extension_props : available_extensions) {
22858 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22859 // Create two pNext structures which by themselves would be valid
22860 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22861 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22862 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22863 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22864 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22865
22866 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22867 dedicated_buffer_create_info_2.pNext = nullptr;
22868 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22869
22870 uint32_t queue_family_index = 0;
22871 VkBufferCreateInfo buffer_create_info = {};
22872 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22873 buffer_create_info.pNext = &dedicated_buffer_create_info;
22874 buffer_create_info.size = 1024;
22875 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22876 buffer_create_info.queueFamilyIndexCount = 1;
22877 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22878
22879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22880 VkBuffer buffer;
22881 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22882 m_errorMonitor->VerifyFound();
22883 }
22884 }
22885 }
22886}
22887
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022888TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22889 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22890
Tony Barbour1fa09702017-03-16 12:09:08 -060022891 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022892
22893 // Positive test to check parameter_validation and unique_objects support
22894 // for NV_dedicated_allocation
22895 uint32_t extension_count = 0;
22896 bool supports_nv_dedicated_allocation = false;
22897 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22898 ASSERT_VK_SUCCESS(err);
22899
22900 if (extension_count > 0) {
22901 std::vector<VkExtensionProperties> available_extensions(extension_count);
22902
22903 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22904 ASSERT_VK_SUCCESS(err);
22905
22906 for (const auto &extension_props : available_extensions) {
22907 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22908 supports_nv_dedicated_allocation = true;
22909 }
22910 }
22911 }
22912
22913 if (supports_nv_dedicated_allocation) {
22914 m_errorMonitor->ExpectSuccess();
22915
22916 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22917 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22918 dedicated_buffer_create_info.pNext = nullptr;
22919 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22920
22921 uint32_t queue_family_index = 0;
22922 VkBufferCreateInfo buffer_create_info = {};
22923 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22924 buffer_create_info.pNext = &dedicated_buffer_create_info;
22925 buffer_create_info.size = 1024;
22926 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22927 buffer_create_info.queueFamilyIndexCount = 1;
22928 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22929
22930 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022931 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022932 ASSERT_VK_SUCCESS(err);
22933
22934 VkMemoryRequirements memory_reqs;
22935 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22936
22937 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22938 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22939 dedicated_memory_info.pNext = nullptr;
22940 dedicated_memory_info.buffer = buffer;
22941 dedicated_memory_info.image = VK_NULL_HANDLE;
22942
22943 VkMemoryAllocateInfo memory_info = {};
22944 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22945 memory_info.pNext = &dedicated_memory_info;
22946 memory_info.allocationSize = memory_reqs.size;
22947
22948 bool pass;
22949 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22950 ASSERT_TRUE(pass);
22951
22952 VkDeviceMemory buffer_memory;
22953 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22954 ASSERT_VK_SUCCESS(err);
22955
22956 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22957 ASSERT_VK_SUCCESS(err);
22958
22959 vkDestroyBuffer(m_device->device(), buffer, NULL);
22960 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22961
22962 m_errorMonitor->VerifyNotFound();
22963 }
22964}
22965
22966TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22967 VkResult err;
22968
22969 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22970
Tony Barbour1fa09702017-03-16 12:09:08 -060022971 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22973
22974 std::vector<const char *> device_extension_names;
22975 auto features = m_device->phy().features();
22976 // Artificially disable support for non-solid fill modes
22977 features.fillModeNonSolid = false;
22978 // The sacrificial device object
22979 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22980
22981 VkRenderpassObj render_pass(&test_device);
22982
22983 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22984 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22985 pipeline_layout_ci.setLayoutCount = 0;
22986 pipeline_layout_ci.pSetLayouts = NULL;
22987
22988 VkPipelineLayout pipeline_layout;
22989 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22990 ASSERT_VK_SUCCESS(err);
22991
22992 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22993 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22994 rs_ci.pNext = nullptr;
22995 rs_ci.lineWidth = 1.0f;
22996 rs_ci.rasterizerDiscardEnable = true;
22997
22998 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22999 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23000
23001 // Set polygonMode=FILL. No error is expected
23002 m_errorMonitor->ExpectSuccess();
23003 {
23004 VkPipelineObj pipe(&test_device);
23005 pipe.AddShader(&vs);
23006 pipe.AddShader(&fs);
23007 pipe.AddColorAttachment();
23008 // Set polygonMode to a good value
23009 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23010 pipe.SetRasterization(&rs_ci);
23011 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23012 }
23013 m_errorMonitor->VerifyNotFound();
23014
23015 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23016}
23017
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023018#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023019TEST_F(VkPositiveLayerTest, LongFenceChain)
23020{
23021 m_errorMonitor->ExpectSuccess();
23022
Tony Barbour1fa09702017-03-16 12:09:08 -060023023 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023024 VkResult err;
23025
23026 std::vector<VkFence> fences;
23027
23028 const int chainLength = 32768;
23029
23030 for (int i = 0; i < chainLength; i++) {
23031 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23032 VkFence fence;
23033 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23034 ASSERT_VK_SUCCESS(err);
23035
23036 fences.push_back(fence);
23037
23038 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23039 0, nullptr, 0, nullptr };
23040 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23041 ASSERT_VK_SUCCESS(err);
23042
23043 }
23044
23045 // BOOM, stack overflow.
23046 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23047
23048 for (auto fence : fences)
23049 vkDestroyFence(m_device->device(), fence, nullptr);
23050
23051 m_errorMonitor->VerifyNotFound();
23052}
23053#endif
23054
Cody Northrop1242dfd2016-07-13 17:24:59 -060023055#if defined(ANDROID) && defined(VALIDATION_APK)
23056static bool initialized = false;
23057static bool active = false;
23058
23059// Convert Intents to argv
23060// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023061std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023062 std::vector<std::string> args;
23063 JavaVM &vm = *app.activity->vm;
23064 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023065 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023066
23067 JNIEnv &env = *p_env;
23068 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023069 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023070 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023071 jmethodID get_string_extra_method =
23072 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023073 jvalue get_string_extra_args;
23074 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023075 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023076
23077 std::string args_str;
23078 if (extra_str) {
23079 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23080 args_str = extra_utf;
23081 env.ReleaseStringUTFChars(extra_str, extra_utf);
23082 env.DeleteLocalRef(extra_str);
23083 }
23084
23085 env.DeleteLocalRef(get_string_extra_args.l);
23086 env.DeleteLocalRef(intent);
23087 vm.DetachCurrentThread();
23088
23089 // split args_str
23090 std::stringstream ss(args_str);
23091 std::string arg;
23092 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023093 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023094 }
23095
23096 return args;
23097}
23098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023099static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023101static void processCommand(struct android_app *app, int32_t cmd) {
23102 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023103 case APP_CMD_INIT_WINDOW: {
23104 if (app->window) {
23105 initialized = true;
23106 }
23107 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023108 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023109 case APP_CMD_GAINED_FOCUS: {
23110 active = true;
23111 break;
23112 }
23113 case APP_CMD_LOST_FOCUS: {
23114 active = false;
23115 break;
23116 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023117 }
23118}
23119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023120void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023121 app_dummy();
23122
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023123 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023124
23125 int vulkanSupport = InitVulkan();
23126 if (vulkanSupport == 0) {
23127 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23128 return;
23129 }
23130
23131 app->onAppCmd = processCommand;
23132 app->onInputEvent = processInput;
23133
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023134 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023135 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023136 struct android_poll_source *source;
23137 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023138 if (source) {
23139 source->process(app, source);
23140 }
23141
23142 if (app->destroyRequested != 0) {
23143 VkTestFramework::Finish();
23144 return;
23145 }
23146 }
23147
23148 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023149 // Use the following key to send arguments to gtest, i.e.
23150 // --es args "--gtest_filter=-VkLayerTest.foo"
23151 const char key[] = "args";
23152 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023153
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023154 std::string filter = "";
23155 if (args.size() > 0) {
23156 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23157 filter += args[0];
23158 } else {
23159 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23160 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023161
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023162 int argc = 2;
23163 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23164 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023166 // Route output to files until we can override the gtest output
23167 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23168 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023170 ::testing::InitGoogleTest(&argc, argv);
23171 VkTestFramework::InitArgs(&argc, argv);
23172 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023174 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023176 if (result != 0) {
23177 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23178 } else {
23179 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23180 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023182 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023184 fclose(stdout);
23185 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023186
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023187 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023188 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023189 }
23190 }
23191}
23192#endif
23193
Tony Barbour300a6082015-04-07 13:44:53 -060023194int main(int argc, char **argv) {
23195 int result;
23196
Cody Northrop8e54a402016-03-08 22:25:52 -070023197#ifdef ANDROID
23198 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023199 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023200#endif
23201
Tony Barbour300a6082015-04-07 13:44:53 -060023202 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023203 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023204
23205 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23206
23207 result = RUN_ALL_TESTS();
23208
Tony Barbour6918cd52015-04-09 12:58:51 -060023209 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023210 return result;
23211}