blob: a964e9417d2230e398b67d9b5d4b3c5ace243369 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600341 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600343 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600344}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345
Karl Schultz6addd812016-02-02 17:17:23 -0700346class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700347 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600348 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
349 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700350 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600351 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
352 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 }
Tony Barbour300a6082015-04-07 13:44:53 -0600354
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600355 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
356 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600358 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700359 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600360 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600362 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
363 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
364 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700365 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
366 }
367 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
368 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
369 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600370 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
371 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
372 InitState(features, flags);
373 }
374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700375 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700376 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600377 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600378 std::vector<const char *> instance_layer_names;
379 std::vector<const char *> instance_extension_names;
380 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600381
382 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700383 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600384 /*
385 * Since CreateDbgMsgCallback is an instance level extension call
386 * any extension / layer that utilizes that feature also needs
387 * to be enabled at create instance time.
388 */
Karl Schultz6addd812016-02-02 17:17:23 -0700389 // Use Threading layer first to protect others from
390 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700391 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600392 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800393 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700394 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600395 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700396 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600397
Ian Elliott2c1daf52016-05-12 09:41:46 -0600398 if (m_enableWSI) {
399 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
400 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
401#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
402#if defined(VK_USE_PLATFORM_ANDROID_KHR)
403 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405#if defined(VK_USE_PLATFORM_MIR_KHR)
406 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700407#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600408#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
409 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_WIN32_KHR)
412 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_WIN32_KHR
414#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600415#if defined(VK_USE_PLATFORM_XCB_KHR)
416 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
417#elif defined(VK_USE_PLATFORM_XLIB_KHR)
418 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600420 }
421
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600423 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800424 this->app_info.pApplicationName = "layer_tests";
425 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600426 this->app_info.pEngineName = "unittest";
427 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600428 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600429
Tony Barbour15524c32015-04-29 17:34:29 -0600430 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600431 }
432
433 virtual void TearDown() {
434 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600435 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600436 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600438
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600439 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600440};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500441
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 // Create identity matrix
444 int i;
445 struct vktriangle_vs_uniform data;
446
447 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700448 glm::mat4 View = glm::mat4(1.0f);
449 glm::mat4 Model = glm::mat4(1.0f);
450 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700452 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 memcpy(&data.mvp, &MVP[0][0], matrixSize);
455
Karl Schultz6addd812016-02-02 17:17:23 -0700456 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600457 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500458 };
459
Karl Schultz6addd812016-02-02 17:17:23 -0700460 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461 data.position[i][0] = tri_data[i].posX;
462 data.position[i][1] = tri_data[i].posY;
463 data.position[i][2] = tri_data[i].posZ;
464 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700465 data.color[i][0] = tri_data[i].r;
466 data.color[i][1] = tri_data[i].g;
467 data.color[i][2] = tri_data[i].b;
468 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500469 }
470
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 ASSERT_NO_FATAL_FAILURE(InitViewport());
472
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200473 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
474 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475
Karl Schultz6addd812016-02-02 17:17:23 -0700476 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600477 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800480 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481 pipelineobj.AddShader(&vs);
482 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 if (failMask & BsoFailLineWidth) {
484 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600485 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600486 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600487 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
488 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 }
490 if (failMask & BsoFailDepthBias) {
491 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600492 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600493 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600495 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600496 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700498 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700499 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600500 if (failMask & BsoFailViewport) {
501 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
502 }
503 if (failMask & BsoFailScissor) {
504 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
505 }
506 if (failMask & BsoFailBlend) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600508 VkPipelineColorBlendAttachmentState att_state = {};
509 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
510 att_state.blendEnable = VK_TRUE;
511 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600512 }
513 if (failMask & BsoFailDepthBounds) {
514 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
515 }
516 if (failMask & BsoFailStencilReadMask) {
517 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
518 }
519 if (failMask & BsoFailStencilWriteMask) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
521 }
522 if (failMask & BsoFailStencilReference) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
524 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500525
526 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600527 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700530 m_commandBuffer->BeginCommandBuffer();
531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600536 if (failMask & BsoFailIndexBuffer) {
537 // Use DrawIndexed w/o an index buffer bound
538 DrawIndexed(3, 1, 0, 0, 0);
539 } else {
540 Draw(3, 1, 0, 0);
541 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500542
Mark Muellerd4914412016-06-13 17:52:06 -0600543 if (failMask & BsoFailCmdClearAttachments) {
544 VkClearAttachment color_attachment = {};
545 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700546 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600547 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
548
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600549 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600550 }
551
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700553 m_commandBuffer->EndRenderPass();
554 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600555 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500556}
557
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600558void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
559 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500560 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600563 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500564 }
565
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800566 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700567 // Make sure depthWriteEnable is set so that Depth fail test will work
568 // correctly
569 // Make sure stencilTestEnable is set so that Stencil fail test will work
570 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600571 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800572 stencil.failOp = VK_STENCIL_OP_KEEP;
573 stencil.passOp = VK_STENCIL_OP_KEEP;
574 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
575 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600576
577 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
578 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600579 ds_ci.pNext = NULL;
580 ds_ci.depthTestEnable = VK_FALSE;
581 ds_ci.depthWriteEnable = VK_TRUE;
582 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
583 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600584 if (failMask & BsoFailDepthBounds) {
585 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600586 ds_ci.maxDepthBounds = 0.0f;
587 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600588 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600589 ds_ci.stencilTestEnable = VK_TRUE;
590 ds_ci.front = stencil;
591 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600592
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600593 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600594 pipelineobj.SetViewport(m_viewports);
595 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600597 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600598 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 commandBuffer->BindPipeline(pipelineobj);
600 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500601}
602
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600603class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700604 public:
605 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600606};
607
Ian Elliott2c1daf52016-05-12 09:41:46 -0600608class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700609 public:
610 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600611 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600612};
613
Mark Muellerdfe37552016-07-07 14:47:42 -0600614class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600616 enum eTestEnFlags {
617 eDoubleDelete,
618 eInvalidDeviceOffset,
619 eInvalidMemoryOffset,
620 eBindNullBuffer,
621 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600622 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 };
624
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600625 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
628 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 return true;
630 }
631 VkDeviceSize offset_limit = 0;
632 if (eInvalidMemoryOffset == aTestFlag) {
633 VkBuffer vulkanBuffer;
634 VkBufferCreateInfo buffer_create_info = {};
635 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
636 buffer_create_info.size = 32;
637 buffer_create_info.usage = aBufferUsage;
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600640 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600641
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
644 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
646 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600647 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600651 }
652 if (eOffsetAlignment < offset_limit) {
653 return true;
654 }
655 return false;
656 }
657
658 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600659 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
660 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600661 if (eBindNullBuffer == aTestFlag) {
662 VulkanMemory = 0;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
664 } else {
665 VkBufferCreateInfo buffer_create_info = {};
666 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
667 buffer_create_info.size = 32;
668 buffer_create_info.usage = aBufferUsage;
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
672 CreateCurrent = true;
673
674 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600676
677 VkMemoryAllocateInfo memory_allocate_info = {};
678 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800679 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
681 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682 if (!pass) {
683 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
684 return;
685 }
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 AllocateCurrent = true;
689 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600690 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
691 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600692 BoundCurrent = true;
693
694 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
695 }
696 }
697
698 ~VkBufferTest() {
699 if (CreateCurrent) {
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702 if (AllocateCurrent) {
703 if (InvalidDeleteEn) {
704 union {
705 VkDeviceMemory device_memory;
706 unsigned long long index_access;
707 } bad_index;
708
709 bad_index.device_memory = VulkanMemory;
710 bad_index.index_access++;
711
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600712 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600713 }
714 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
715 }
716 }
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600719
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600721
722 void TestDoubleDestroy() {
723 // Destroy the buffer but leave the flag set, which will cause
724 // the buffer to be destroyed again in the destructor.
725 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
726 }
727
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600729 bool AllocateCurrent;
730 bool BoundCurrent;
731 bool CreateCurrent;
732 bool InvalidDeleteEn;
733
734 VkBuffer VulkanBuffer;
735 VkDevice VulkanDevice;
736 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600737};
738
739class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700740 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600741 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600742 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700743 : BoundCurrent(false),
744 AttributeCount(aAttributeCount),
745 BindingCount(aBindingCount),
746 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600748 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
749 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700750 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600751
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600752 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
753 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
756 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
757 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
758 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
759 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
761 unsigned i = 0;
762 do {
763 VertexInputAttributeDescription[i].binding = BindId;
764 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600765 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
766 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 i++;
768 } while (AttributeCount < i);
769
770 i = 0;
771 do {
772 VertexInputBindingDescription[i].binding = BindId;
773 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600775 i++;
776 } while (BindingCount < i);
777 }
778
779 ~VkVerticesObj() {
780 if (VertexInputAttributeDescription) {
781 delete[] VertexInputAttributeDescription;
782 }
783 if (VertexInputBindingDescription) {
784 delete[] VertexInputBindingDescription;
785 }
786 }
787
788 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
790 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600791 return true;
792 }
793
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600794 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600795 VkDeviceSize *offsetList;
796 unsigned offsetCount;
797
798 if (aOffsetCount) {
799 offsetList = aOffsetList;
800 offsetCount = aOffsetCount;
801 } else {
802 offsetList = new VkDeviceSize[1]();
803 offsetCount = 1;
804 }
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600807 BoundCurrent = true;
808
809 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600810 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600811 }
812 }
813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700814 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600815 static uint32_t BindIdGenerator;
816
817 bool BoundCurrent;
818 unsigned AttributeCount;
819 unsigned BindingCount;
820 uint32_t BindId;
821
822 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
823 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
824 VkVertexInputBindingDescription *VertexInputBindingDescription;
825 VkConstantBufferObj VulkanMemoryBuffer;
826};
827
828uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500829// ********************************************************************************************************************
830// ********************************************************************************************************************
831// ********************************************************************************************************************
832// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600833TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700834 TEST_DESCRIPTION(
835 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
836 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837
Tony Barbour1fa09702017-03-16 12:09:08 -0600838 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
848 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 // Specify NULL for pointer to array count
850 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600851 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600852 m_errorMonitor->VerifyFound();
853
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify 0 for a required array count
856 // Expected to trigger an error with parameter_validation::validate_array
857 VkViewport view_port = {};
858 m_commandBuffer->SetViewport(0, 0, &view_port);
859 m_errorMonitor->VerifyFound();
860
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600862 // Specify NULL for a required array
863 // Expected to trigger an error with parameter_validation::validate_array
864 m_commandBuffer->SetViewport(0, 1, NULL);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify VK_NULL_HANDLE for a required handle
869 // Expected to trigger an error with
870 // parameter_validation::validate_required_handle
871 vkUnmapMemory(device(), VK_NULL_HANDLE);
872 m_errorMonitor->VerifyFound();
873
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
875 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600876 // Specify VK_NULL_HANDLE for a required handle array entry
877 // Expected to trigger an error with
878 // parameter_validation::validate_required_handle_array
879 VkFence fence = VK_NULL_HANDLE;
880 vkResetFences(device(), 1, &fence);
881 m_errorMonitor->VerifyFound();
882
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600884 // Specify NULL for a required struct pointer
885 // Expected to trigger an error with
886 // parameter_validation::validate_struct_type
887 VkDeviceMemory memory = VK_NULL_HANDLE;
888 vkAllocateMemory(device(), NULL, NULL, &memory);
889 m_errorMonitor->VerifyFound();
890
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600892 // Specify 0 for a required VkFlags parameter
893 // Expected to trigger an error with parameter_validation::validate_flags
894 m_commandBuffer->SetStencilReference(0, 0);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags array entry
899 // Expected to trigger an error with
900 // parameter_validation::validate_flags_array
901 VkSemaphore semaphore = VK_NULL_HANDLE;
902 VkPipelineStageFlags stageFlags = 0;
903 VkSubmitInfo submitInfo = {};
904 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
905 submitInfo.waitSemaphoreCount = 1;
906 submitInfo.pWaitSemaphores = &semaphore;
907 submitInfo.pWaitDstStageMask = &stageFlags;
908 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
909 m_errorMonitor->VerifyFound();
910}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600911
Dustin Gravesfce74c02016-05-10 11:42:58 -0600912TEST_F(VkLayerTest, ReservedParameter) {
913 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
914
Tony Barbour1fa09702017-03-16 12:09:08 -0600915 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918 // Specify 0 for a reserved VkFlags parameter
919 // Expected to trigger an error with
920 // parameter_validation::validate_reserved_flags
921 VkEvent event_handle = VK_NULL_HANDLE;
922 VkEventCreateInfo event_info = {};
923 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
924 event_info.flags = 1;
925 vkCreateEvent(device(), &event_info, NULL, &event_handle);
926 m_errorMonitor->VerifyFound();
927}
928
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700930 TEST_DESCRIPTION(
931 "Specify an invalid VkStructureType for a Vulkan "
932 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600933
Tony Barbour1fa09702017-03-16 12:09:08 -0600934 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600937 // Zero struct memory, effectively setting sType to
938 // VK_STRUCTURE_TYPE_APPLICATION_INFO
939 // Expected to trigger an error with
940 // parameter_validation::validate_struct_type
941 VkMemoryAllocateInfo alloc_info = {};
942 VkDeviceMemory memory = VK_NULL_HANDLE;
943 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
944 m_errorMonitor->VerifyFound();
945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600947 // Zero struct memory, effectively setting sType to
948 // VK_STRUCTURE_TYPE_APPLICATION_INFO
949 // Expected to trigger an error with
950 // parameter_validation::validate_struct_type_array
951 VkSubmitInfo submit_info = {};
952 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
953 m_errorMonitor->VerifyFound();
954}
955
956TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600957 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600958
Tony Barbour1fa09702017-03-16 12:09:08 -0600959 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600960
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600962 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600963 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600965 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600966 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600967 // Zero-initialization will provide the correct sType
968 VkApplicationInfo app_info = {};
969 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
970 event_alloc_info.pNext = &app_info;
971 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
975 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600976 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
977 // a function that has allowed pNext structure types and specify
978 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600979 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600980 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600981 VkMemoryAllocateInfo memory_alloc_info = {};
982 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 memory_alloc_info.pNext = &app_info;
984 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600985 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986}
Dustin Graves5d33d532016-05-09 16:21:12 -0600987
988TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990
Tony Barbour1fa09702017-03-16 12:09:08 -0600991 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
994 "does not fall within the begin..end "
995 "range of the core VkFormat "
996 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkFormat value
998 // Expected to trigger an error with
999 // parameter_validation::validate_ranged_enum
1000 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001001 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001002 m_errorMonitor->VerifyFound();
1003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001005 // Specify an invalid VkFlags bitmask value
1006 // Expected to trigger an error with parameter_validation::validate_flags
1007 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001008 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1009 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001010 m_errorMonitor->VerifyFound();
1011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001013 // Specify an invalid VkFlags array entry
1014 // Expected to trigger an error with
1015 // parameter_validation::validate_flags_array
1016 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001017 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001018 VkSubmitInfo submit_info = {};
1019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1020 submit_info.waitSemaphoreCount = 1;
1021 submit_info.pWaitSemaphores = &semaphore;
1022 submit_info.pWaitDstStageMask = &stage_flags;
1023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1024 m_errorMonitor->VerifyFound();
1025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001027 // Specify an invalid VkBool32 value
1028 // Expected to trigger a warning with
1029 // parameter_validation::validate_bool32
1030 VkSampler sampler = VK_NULL_HANDLE;
1031 VkSamplerCreateInfo sampler_info = {};
1032 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1033 sampler_info.pNext = NULL;
1034 sampler_info.magFilter = VK_FILTER_NEAREST;
1035 sampler_info.minFilter = VK_FILTER_NEAREST;
1036 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1037 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1038 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1039 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1040 sampler_info.mipLodBias = 1.0;
1041 sampler_info.maxAnisotropy = 1;
1042 sampler_info.compareEnable = VK_FALSE;
1043 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1044 sampler_info.minLod = 1.0;
1045 sampler_info.maxLod = 1.0;
1046 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1047 sampler_info.unnormalizedCoordinates = VK_FALSE;
1048 // Not VK_TRUE or VK_FALSE
1049 sampler_info.anisotropyEnable = 3;
1050 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1051 m_errorMonitor->VerifyFound();
1052}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053
1054TEST_F(VkLayerTest, FailedReturnValue) {
1055 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1056
Tony Barbour1fa09702017-03-16 12:09:08 -06001057 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001058
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001059 // Find an unsupported image format
1060 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1061 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1062 VkFormat format = static_cast<VkFormat>(f);
1063 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001064 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 unsupported = format;
1066 break;
1067 }
1068 }
1069
1070 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1072 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001073 // Specify an unsupported VkFormat value to generate a
1074 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1075 // Expected to trigger a warning from
1076 // parameter_validation::validate_result
1077 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1079 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001080 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1081 m_errorMonitor->VerifyFound();
1082 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001083}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084
1085TEST_F(VkLayerTest, UpdateBufferAlignment) {
1086 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088
Tony Barbour1fa09702017-03-16 12:09:08 -06001089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1092 vk_testing::Buffer buffer;
1093 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1094
Tony Barbour552f6c02016-12-21 14:34:07 -07001095 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001098 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1099 m_errorMonitor->VerifyFound();
1100
1101 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001103 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1104 m_errorMonitor->VerifyFound();
1105
1106 // Introduce failure by using dataSize that is < 0
1107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is > 65536
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1116 m_errorMonitor->VerifyFound();
1117
Tony Barbour552f6c02016-12-21 14:34:07 -07001118 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119}
1120
1121TEST_F(VkLayerTest, FillBufferAlignment) {
1122 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1123
Tony Barbour1fa09702017-03-16 12:09:08 -06001124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125
1126 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1127 vk_testing::Buffer buffer;
1128 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1129
Tony Barbour552f6c02016-12-21 14:34:07 -07001130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001134 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1135 m_errorMonitor->VerifyFound();
1136
1137 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001139 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1140 m_errorMonitor->VerifyFound();
1141
1142 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001144 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1145 m_errorMonitor->VerifyFound();
1146
Tony Barbour552f6c02016-12-21 14:34:07 -07001147 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001148}
Dustin Graves40f35822016-06-23 11:12:53 -06001149
Cortd889ff92016-07-27 09:51:27 -07001150TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1151 VkResult err;
1152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001153 TEST_DESCRIPTION(
1154 "Attempt to use a non-solid polygon fill mode in a "
1155 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001156
Tony Barbour1fa09702017-03-16 12:09:08 -06001157 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1159
1160 std::vector<const char *> device_extension_names;
1161 auto features = m_device->phy().features();
1162 // Artificially disable support for non-solid fill modes
1163 features.fillModeNonSolid = false;
1164 // The sacrificial device object
1165 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1166
1167 VkRenderpassObj render_pass(&test_device);
1168
1169 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1170 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1171 pipeline_layout_ci.setLayoutCount = 0;
1172 pipeline_layout_ci.pSetLayouts = NULL;
1173
1174 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001175 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001176 ASSERT_VK_SUCCESS(err);
1177
1178 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1179 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1180 rs_ci.pNext = nullptr;
1181 rs_ci.lineWidth = 1.0f;
1182 rs_ci.rasterizerDiscardEnable = true;
1183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001184 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1185 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001186
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001187 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
1202 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1204 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001205 {
1206 VkPipelineObj pipe(&test_device);
1207 pipe.AddShader(&vs);
1208 pipe.AddShader(&fs);
1209 pipe.AddColorAttachment();
1210 // Introduce failure by setting unsupported polygon mode
1211 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1212 pipe.SetRasterization(&rs_ci);
1213 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1214 }
1215 m_errorMonitor->VerifyFound();
1216
Cortd889ff92016-07-27 09:51:27 -07001217 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1218}
1219
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001220#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001221TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001222{
1223 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001224 VkFenceCreateInfo fenceInfo = {};
1225 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1226 fenceInfo.pNext = NULL;
1227 fenceInfo.flags = 0;
1228
Mike Weiblencce7ec72016-10-17 19:33:05 -06001229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001230
Tony Barbour1fa09702017-03-16 12:09:08 -06001231 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001232
1233 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1234 vk_testing::Buffer buffer;
1235 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Tony Barbourfe3351b2015-07-28 10:17:20 -06001237 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001238 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001239 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240
1241 testFence.init(*m_device, fenceInfo);
1242
1243 // Bypass framework since it does the waits automatically
1244 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1247 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001248 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001249 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001250 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001251 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001253 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001254 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001255
1256 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257 ASSERT_VK_SUCCESS( err );
1258
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001259 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001260 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001262 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263}
1264
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001266{
1267 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001268 VkFenceCreateInfo fenceInfo = {};
1269 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1270 fenceInfo.pNext = NULL;
1271 fenceInfo.flags = 0;
1272
Mike Weiblencce7ec72016-10-17 19:33:05 -06001273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274
Tony Barbour1fa09702017-03-16 12:09:08 -06001275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001276 ASSERT_NO_FATAL_FAILURE(InitViewport());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1278
Tony Barbourfe3351b2015-07-28 10:17:20 -06001279 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001280 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001281 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282
1283 testFence.init(*m_device, fenceInfo);
1284
1285 // Bypass framework since it does the waits automatically
1286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001296 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001297
1298 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299 ASSERT_VK_SUCCESS( err );
1300
Jon Ashburnf19916e2016-01-11 13:12:43 -07001301 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001302 VkCommandBufferBeginInfo info = {};
1303 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1304 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001305 info.renderPass = VK_NULL_HANDLE;
1306 info.subpass = 0;
1307 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001308 info.occlusionQueryEnable = VK_FALSE;
1309 info.queryFlags = 0;
1310 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311
1312 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001313 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001315 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001316}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001317#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001318
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001319TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1320 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1321
Tony Barbour1fa09702017-03-16 12:09:08 -06001322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001323
1324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1325 VkBuffer buffer;
1326 VkBufferCreateInfo buf_info = {};
1327 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1328 buf_info.pNext = NULL;
1329 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1330 buf_info.size = 2048;
1331 buf_info.queueFamilyIndexCount = 0;
1332 buf_info.pQueueFamilyIndices = NULL;
1333 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1334 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1335 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1336 m_errorMonitor->VerifyFound();
1337
1338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1339 VkImage image;
1340 VkImageCreateInfo image_create_info = {};
1341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1342 image_create_info.pNext = NULL;
1343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1344 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1345 image_create_info.extent.width = 512;
1346 image_create_info.extent.height = 64;
1347 image_create_info.extent.depth = 1;
1348 image_create_info.mipLevels = 1;
1349 image_create_info.arrayLayers = 1;
1350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1352 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1354 image_create_info.queueFamilyIndexCount = 0;
1355 image_create_info.pQueueFamilyIndices = NULL;
1356 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1357 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1358 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1359 m_errorMonitor->VerifyFound();
1360}
1361
Dave Houlton829c0d82017-01-24 15:09:17 -07001362TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1363 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1364
1365 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001366 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001367 ASSERT_NO_FATAL_FAILURE(
1368 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001369 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001370
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001371 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 device_features.sparseResidencyImage2D = VK_FALSE;
1373 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001374 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001375
1376 VkImage image = VK_NULL_HANDLE;
1377 VkResult result = VK_RESULT_MAX_ENUM;
1378 VkImageCreateInfo image_create_info = {};
1379 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1380 image_create_info.pNext = NULL;
1381 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1382 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1383 image_create_info.extent.width = 512;
1384 image_create_info.extent.height = 1;
1385 image_create_info.extent.depth = 1;
1386 image_create_info.mipLevels = 1;
1387 image_create_info.arrayLayers = 1;
1388 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1389 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1390 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1391 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1392 image_create_info.queueFamilyIndexCount = 0;
1393 image_create_info.pQueueFamilyIndices = NULL;
1394 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1395 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1396
1397 // 1D image w/ sparse residency is an error
1398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1399 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1400 m_errorMonitor->VerifyFound();
1401 if (VK_SUCCESS == result) {
1402 vkDestroyImage(m_device->device(), image, NULL);
1403 image = VK_NULL_HANDLE;
1404 }
1405
1406 // 2D image w/ sparse residency when feature isn't available
1407 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1408 image_create_info.extent.height = 64;
1409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1410 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1411 m_errorMonitor->VerifyFound();
1412 if (VK_SUCCESS == result) {
1413 vkDestroyImage(m_device->device(), image, NULL);
1414 image = VK_NULL_HANDLE;
1415 }
1416
1417 // 3D image w/ sparse residency when feature isn't available
1418 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1419 image_create_info.extent.depth = 8;
1420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1421 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1422 m_errorMonitor->VerifyFound();
1423 if (VK_SUCCESS == result) {
1424 vkDestroyImage(m_device->device(), image, NULL);
1425 image = VK_NULL_HANDLE;
1426 }
1427}
1428
1429TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1430 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1431
1432 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001433 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001434 ASSERT_NO_FATAL_FAILURE(
1435 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001436 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001437
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001438 // These tests require that the device support sparse residency for 2D images
1439 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1440 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001441 return;
1442 }
1443
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001444 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001445 device_features.sparseResidency2Samples = VK_FALSE;
1446 device_features.sparseResidency4Samples = VK_FALSE;
1447 device_features.sparseResidency8Samples = VK_FALSE;
1448 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001449 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001450
1451 VkImage image = VK_NULL_HANDLE;
1452 VkResult result = VK_RESULT_MAX_ENUM;
1453 VkImageCreateInfo image_create_info = {};
1454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1455 image_create_info.pNext = NULL;
1456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1457 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1458 image_create_info.extent.width = 64;
1459 image_create_info.extent.height = 64;
1460 image_create_info.extent.depth = 1;
1461 image_create_info.mipLevels = 1;
1462 image_create_info.arrayLayers = 1;
1463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1465 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1466 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1467 image_create_info.queueFamilyIndexCount = 0;
1468 image_create_info.pQueueFamilyIndices = NULL;
1469 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1470 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1471
1472 // 2D image w/ sparse residency and linear tiling is an error
1473 m_errorMonitor->SetDesiredFailureMsg(
1474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1475 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1476 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1477 m_errorMonitor->VerifyFound();
1478 if (VK_SUCCESS == result) {
1479 vkDestroyImage(m_device->device(), image, NULL);
1480 image = VK_NULL_HANDLE;
1481 }
1482 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1483
1484 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1485 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1487 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1488 m_errorMonitor->VerifyFound();
1489 if (VK_SUCCESS == result) {
1490 vkDestroyImage(m_device->device(), image, NULL);
1491 image = VK_NULL_HANDLE;
1492 }
1493
1494 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1496 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1497 m_errorMonitor->VerifyFound();
1498 if (VK_SUCCESS == result) {
1499 vkDestroyImage(m_device->device(), image, NULL);
1500 image = VK_NULL_HANDLE;
1501 }
1502
1503 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1505 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1506 m_errorMonitor->VerifyFound();
1507 if (VK_SUCCESS == result) {
1508 vkDestroyImage(m_device->device(), image, NULL);
1509 image = VK_NULL_HANDLE;
1510 }
1511
1512 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1514 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1515 m_errorMonitor->VerifyFound();
1516 if (VK_SUCCESS == result) {
1517 vkDestroyImage(m_device->device(), image, NULL);
1518 image = VK_NULL_HANDLE;
1519 }
1520}
1521
Tobin Ehlisf11be982016-05-11 13:52:53 -06001522TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001523 TEST_DESCRIPTION(
1524 "Create a buffer and image, allocate memory, and bind the "
1525 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526 VkResult err;
1527 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001529
Tobin Ehlis077ded32016-05-12 17:39:13 -06001530 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001531 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001532 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001533 VkDeviceMemory mem; // buffer will be bound first
1534 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001535 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001536 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537
1538 VkBufferCreateInfo buf_info = {};
1539 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1540 buf_info.pNext = NULL;
1541 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1542 buf_info.size = 256;
1543 buf_info.queueFamilyIndexCount = 0;
1544 buf_info.pQueueFamilyIndices = NULL;
1545 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1546 buf_info.flags = 0;
1547 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1548 ASSERT_VK_SUCCESS(err);
1549
Tobin Ehlis077ded32016-05-12 17:39:13 -06001550 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
1552 VkImageCreateInfo image_create_info = {};
1553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1554 image_create_info.pNext = NULL;
1555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1556 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1557 image_create_info.extent.width = 64;
1558 image_create_info.extent.height = 64;
1559 image_create_info.extent.depth = 1;
1560 image_create_info.mipLevels = 1;
1561 image_create_info.arrayLayers = 1;
1562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001563 // Image tiling must be optimal to trigger error when aliasing linear buffer
1564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001565 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1566 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1567 image_create_info.queueFamilyIndexCount = 0;
1568 image_create_info.pQueueFamilyIndices = NULL;
1569 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1570 image_create_info.flags = 0;
1571
Tobin Ehlisf11be982016-05-11 13:52:53 -06001572 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1573 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1575 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001576
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1578
1579 VkMemoryAllocateInfo alloc_info = {};
1580 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1581 alloc_info.pNext = NULL;
1582 alloc_info.memoryTypeIndex = 0;
1583 // Ensure memory is big enough for both bindings
1584 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001585 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1586 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001588 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001589 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001590 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 return;
1592 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1594 ASSERT_VK_SUCCESS(err);
1595 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1596 ASSERT_VK_SUCCESS(err);
1597
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1599
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001601 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001602 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1603 m_errorMonitor->VerifyFound();
1604
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001606 // aliasing buffer2
1607 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1608 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001609 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1610 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001612 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001614 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001615 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001616 m_errorMonitor->VerifyFound();
1617
1618 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001619 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001620 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001621 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 vkFreeMemory(m_device->device(), mem, NULL);
1623 vkFreeMemory(m_device->device(), mem_img, NULL);
1624}
1625
Tobin Ehlis35372522016-05-12 08:32:31 -06001626TEST_F(VkLayerTest, InvalidMemoryMapping) {
1627 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1628 VkResult err;
1629 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001631
1632 VkBuffer buffer;
1633 VkDeviceMemory mem;
1634 VkMemoryRequirements mem_reqs;
1635
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001636 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1637
Tobin Ehlis35372522016-05-12 08:32:31 -06001638 VkBufferCreateInfo buf_info = {};
1639 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1640 buf_info.pNext = NULL;
1641 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1642 buf_info.size = 256;
1643 buf_info.queueFamilyIndexCount = 0;
1644 buf_info.pQueueFamilyIndices = NULL;
1645 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1646 buf_info.flags = 0;
1647 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1648 ASSERT_VK_SUCCESS(err);
1649
1650 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1651 VkMemoryAllocateInfo alloc_info = {};
1652 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1653 alloc_info.pNext = NULL;
1654 alloc_info.memoryTypeIndex = 0;
1655
1656 // Ensure memory is big enough for both bindings
1657 static const VkDeviceSize allocation_size = 0x10000;
1658 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001660 if (!pass) {
1661 vkDestroyBuffer(m_device->device(), buffer, NULL);
1662 return;
1663 }
1664 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1665 ASSERT_VK_SUCCESS(err);
1666
1667 uint8_t *pData;
1668 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1671 m_errorMonitor->VerifyFound();
1672 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001673 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1676 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1677 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001678 m_errorMonitor->VerifyFound();
1679
1680 // Unmap the memory to avoid re-map error
1681 vkUnmapMemory(m_device->device(), mem);
1682 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1685 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001686 m_errorMonitor->VerifyFound();
1687 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1689 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001690 m_errorMonitor->VerifyFound();
1691 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001693 vkUnmapMemory(m_device->device(), mem);
1694 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001697 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001698 ASSERT_VK_SUCCESS(err);
1699 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001700 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001701 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1705 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001706
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 // Now flush range that oversteps mapped range
1708 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001709 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001711 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001712 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1714 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1715 m_errorMonitor->VerifyFound();
1716
1717 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1718 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001719 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001720 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001721 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001722 mmr.size = VK_WHOLE_SIZE;
1723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001724 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1725 m_errorMonitor->VerifyFound();
1726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001727#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001728 // Some platforms have an atomsize of 1 which makes the test meaningless
1729 if (atom_size > 3) {
1730 // Now with an offset NOT a multiple of the device limit
1731 vkUnmapMemory(m_device->device(), mem);
1732 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1733 ASSERT_VK_SUCCESS(err);
1734 mmr.offset = 3; // Not a multiple of atom_size
1735 mmr.size = VK_WHOLE_SIZE;
1736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1737 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1738 m_errorMonitor->VerifyFound();
1739
1740 // Now with a size NOT a multiple of the device limit
1741 vkUnmapMemory(m_device->device(), mem);
1742 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1743 ASSERT_VK_SUCCESS(err);
1744 mmr.offset = atom_size;
1745 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1747 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1748 m_errorMonitor->VerifyFound();
1749 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001750#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1752 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001753 if (!pass) {
1754 vkFreeMemory(m_device->device(), mem, NULL);
1755 vkDestroyBuffer(m_device->device(), buffer, NULL);
1756 return;
1757 }
1758 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1759 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1760
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 vkFreeMemory(m_device->device(), mem, NULL);
1763}
1764
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001765#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001766TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1767 VkResult err;
1768 bool pass;
1769
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001770 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1771 // following declaration (which is temporarily being moved below):
1772 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001773 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001774 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001775 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001777 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001778 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001779
Tony Barbour1fa09702017-03-16 12:09:08 -06001780 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001781
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1783#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1784 // Use the functions from the VK_KHR_android_surface extension without
1785 // enabling that extension:
1786
1787 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001788 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1790 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001791 pass = (err != VK_SUCCESS);
1792 ASSERT_TRUE(pass);
1793 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001794#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001795
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796#if defined(VK_USE_PLATFORM_MIR_KHR)
1797 // Use the functions from the VK_KHR_mir_surface extension without enabling
1798 // that extension:
1799
1800 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001801 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001803 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1804 pass = (err != VK_SUCCESS);
1805 ASSERT_TRUE(pass);
1806 m_errorMonitor->VerifyFound();
1807
1808 // Tell whether an mir_connection supports presentation:
1809 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1811 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001812 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001813#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1816 // Use the functions from the VK_KHR_wayland_surface extension without
1817 // enabling that extension:
1818
1819 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001820 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1822 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 pass = (err != VK_SUCCESS);
1824 ASSERT_TRUE(pass);
1825 m_errorMonitor->VerifyFound();
1826
1827 // Tell whether an wayland_display supports presentation:
1828 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1830 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001831 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001832#endif // VK_USE_PLATFORM_WAYLAND_KHR
1833#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001834
Ian Elliott3f06ce52016-04-29 14:46:21 -06001835#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001836 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1837 // TO NON-LINUX PLATFORMS:
1838 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001839 // Use the functions from the VK_KHR_win32_surface extension without
1840 // enabling that extension:
1841
1842 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001843 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1845 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001846 pass = (err != VK_SUCCESS);
1847 ASSERT_TRUE(pass);
1848 m_errorMonitor->VerifyFound();
1849
1850 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001852 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001853 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001854// Set this (for now, until all platforms are supported and tested):
1855#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001856#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001857#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001858 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1859 // TO NON-LINUX PLATFORMS:
1860 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001861#endif
1862#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1864 // that extension:
1865
1866 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001867 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1870 pass = (err != VK_SUCCESS);
1871 ASSERT_TRUE(pass);
1872 m_errorMonitor->VerifyFound();
1873
1874 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001875 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001876 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1878 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001879 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001880// Set this (for now, until all platforms are supported and tested):
1881#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001882#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott12630812016-04-29 14:35:43 -06001884#if defined(VK_USE_PLATFORM_XLIB_KHR)
1885 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1886 // that extension:
1887
1888 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001889 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001891 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1892 pass = (err != VK_SUCCESS);
1893 ASSERT_TRUE(pass);
1894 m_errorMonitor->VerifyFound();
1895
1896 // Tell whether an Xlib VisualID supports presentation:
1897 Display *dpy = NULL;
1898 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001900 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1901 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001902// Set this (for now, until all platforms are supported and tested):
1903#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001904#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001905
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001906// Use the functions from the VK_KHR_surface extension without enabling
1907// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001908
Ian Elliott489eec02016-05-05 14:12:44 -06001909#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001910 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001912 vkDestroySurfaceKHR(instance(), surface, NULL);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check if surface supports presentation:
1916 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1919 pass = (err != VK_SUCCESS);
1920 ASSERT_TRUE(pass);
1921 m_errorMonitor->VerifyFound();
1922
1923 // Check surface capabilities:
1924 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1926 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001927 pass = (err != VK_SUCCESS);
1928 ASSERT_TRUE(pass);
1929 m_errorMonitor->VerifyFound();
1930
1931 // Check surface formats:
1932 uint32_t format_count = 0;
1933 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1935 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001936 pass = (err != VK_SUCCESS);
1937 ASSERT_TRUE(pass);
1938 m_errorMonitor->VerifyFound();
1939
1940 // Check surface present modes:
1941 uint32_t present_mode_count = 0;
1942 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1944 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001945 pass = (err != VK_SUCCESS);
1946 ASSERT_TRUE(pass);
1947 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001948#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001949
Ian Elliott1c32c772016-04-28 14:47:13 -06001950 // Use the functions from the VK_KHR_swapchain extension without enabling
1951 // that extension:
1952
1953 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001955 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1956 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001957 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 pass = (err != VK_SUCCESS);
1959 ASSERT_TRUE(pass);
1960 m_errorMonitor->VerifyFound();
1961
1962 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1964 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001965 pass = (err != VK_SUCCESS);
1966 ASSERT_TRUE(pass);
1967 m_errorMonitor->VerifyFound();
1968
Chris Forbeseb7d5502016-09-13 18:19:21 +12001969 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1970 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1971 VkFence fence;
1972 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1973
Ian Elliott1c32c772016-04-28 14:47:13 -06001974 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001976 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001977 pass = (err != VK_SUCCESS);
1978 ASSERT_TRUE(pass);
1979 m_errorMonitor->VerifyFound();
1980
Chris Forbeseb7d5502016-09-13 18:19:21 +12001981 vkDestroyFence(m_device->device(), fence, nullptr);
1982
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001984 //
1985 // NOTE: Currently can't test this because a real swapchain is needed (as
1986 // opposed to the fake one we created) in order for the layer to lookup the
1987 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001988
1989 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001991 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1992 m_errorMonitor->VerifyFound();
1993}
Chris Forbes09368e42016-10-13 11:59:22 +13001994#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001995
Karl Schultz6addd812016-02-02 17:17:23 -07001996TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1997 VkResult err;
1998 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2001 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002002
Tony Barbour1fa09702017-03-16 12:09:08 -06002003 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002004
2005 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002006 VkImage image;
2007 VkDeviceMemory mem;
2008 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Karl Schultz6addd812016-02-02 17:17:23 -07002010 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2011 const int32_t tex_width = 32;
2012 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013
Tony Barboureb254902015-07-15 12:50:33 -06002014 VkImageCreateInfo image_create_info = {};
2015 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 image_create_info.pNext = NULL;
2017 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2018 image_create_info.format = tex_format;
2019 image_create_info.extent.width = tex_width;
2020 image_create_info.extent.height = tex_height;
2021 image_create_info.extent.depth = 1;
2022 image_create_info.mipLevels = 1;
2023 image_create_info.arrayLayers = 1;
2024 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2025 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2026 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2027 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002028 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002029
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002030 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002031 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002032 mem_alloc.pNext = NULL;
2033 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002034
Chia-I Wuf7458c52015-10-26 21:10:41 +08002035 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002036 ASSERT_VK_SUCCESS(err);
2037
Karl Schultz6addd812016-02-02 17:17:23 -07002038 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039
Mark Lobodzinski23065352015-05-29 09:32:35 -05002040 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002041
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002042 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002043 if (!pass) { // If we can't find any unmappable memory this test doesn't
2044 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002046 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002047 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002048
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002050 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002051 ASSERT_VK_SUCCESS(err);
2052
2053 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002054 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 ASSERT_VK_SUCCESS(err);
2056
2057 // Map memory as if to initialize the image
2058 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002059 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002061 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002062
Chia-I Wuf7458c52015-10-26 21:10:41 +08002063 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002064 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002065}
2066
Karl Schultz6addd812016-02-02 17:17:23 -07002067TEST_F(VkLayerTest, RebindMemory) {
2068 VkResult err;
2069 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002072
Tony Barbour1fa09702017-03-16 12:09:08 -06002073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
2075 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002076 VkImage image;
2077 VkDeviceMemory mem1;
2078 VkDeviceMemory mem2;
2079 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2082 const int32_t tex_width = 32;
2083 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002084
Tony Barboureb254902015-07-15 12:50:33 -06002085 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002086 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2087 image_create_info.pNext = NULL;
2088 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2089 image_create_info.format = tex_format;
2090 image_create_info.extent.width = tex_width;
2091 image_create_info.extent.height = tex_height;
2092 image_create_info.extent.depth = 1;
2093 image_create_info.mipLevels = 1;
2094 image_create_info.arrayLayers = 1;
2095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2096 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2097 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2098 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002100 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002101 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2102 mem_alloc.pNext = NULL;
2103 mem_alloc.allocationSize = 0;
2104 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002105
Karl Schultz6addd812016-02-02 17:17:23 -07002106 // Introduce failure, do NOT set memProps to
2107 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002108 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002113
2114 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002116 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002117
2118 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002119 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002120 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002121 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002122 ASSERT_VK_SUCCESS(err);
2123
2124 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002125 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
2127
Karl Schultz6addd812016-02-02 17:17:23 -07002128 // Introduce validation failure, try to bind a different memory object to
2129 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002130 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002132 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002133
Chia-I Wuf7458c52015-10-26 21:10:41 +08002134 vkDestroyImage(m_device->device(), image, NULL);
2135 vkFreeMemory(m_device->device(), mem1, NULL);
2136 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002138
Karl Schultz6addd812016-02-02 17:17:23 -07002139TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002140 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002141
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2143 "submitted in SIGNALED state. Fences "
2144 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002145
2146 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002147 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2148 fenceInfo.pNext = NULL;
2149 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002150
Tony Barbour1fa09702017-03-16 12:09:08 -06002151 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002152 ASSERT_NO_FATAL_FAILURE(InitViewport());
2153 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2154
Tony Barbour552f6c02016-12-21 14:34:07 -07002155 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002156 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002157 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002158
2159 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002160
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002161 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002162 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2163 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002164 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002165 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002166 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002167 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002168 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002169 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002170 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002171
2172 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002173 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002175 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002176}
Chris Forbes4e44c912016-06-16 10:20:00 +12002177
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002178TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002179 TEST_DESCRIPTION(
2180 "Specify wrong usage for image then create conflicting view of image "
2181 "Initialize buffer with wrong usage then perform copy expecting errors "
2182 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002184
Tony Barbour1fa09702017-03-16 12:09:08 -06002185 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002186 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002187 if (!format) {
2188 printf(" No Depth + Stencil format found. Skipped.\n");
2189 return;
2190 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002191
Tony Barbourf92621a2016-05-02 14:28:12 -06002192 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002193 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002194 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002195 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002196
Tony Barbourf92621a2016-05-02 14:28:12 -06002197 VkImageView dsv;
2198 VkImageViewCreateInfo dsvci = {};
2199 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2200 dsvci.image = image.handle();
2201 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002202 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 dsvci.subresourceRange.layerCount = 1;
2204 dsvci.subresourceRange.baseMipLevel = 0;
2205 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002206 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002207
Tony Barbourf92621a2016-05-02 14:28:12 -06002208 // Create a view with depth / stencil aspect for image with different usage
2209 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002211 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002212
2213 // Initialize buffer with TRANSFER_DST usage
2214 vk_testing::Buffer buffer;
2215 VkMemoryPropertyFlags reqs = 0;
2216 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2217 VkBufferImageCopy region = {};
2218 region.bufferRowLength = 128;
2219 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002220 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002221 region.imageSubresource.layerCount = 1;
2222 region.imageExtent.height = 16;
2223 region.imageExtent.width = 16;
2224 region.imageExtent.depth = 1;
2225
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002227 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002228
Chris Forbesda581202016-10-06 18:25:26 +13002229 // two separate errors from this call:
2230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002233 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2234 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002235 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002236}
Tony Barbour75d79f02016-08-30 09:39:07 -06002237
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002238TEST_F(VkLayerTest, LeakAnObject) {
2239 VkResult err;
2240
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002241 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // Note that we have to create a new device since destroying the
2244 // framework's device causes Teardown() to fail and just calling Teardown
2245 // will destroy the errorMonitor.
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
Tony Barbour1fa09702017-03-16 12:09:08 -06002249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002251 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252 std::vector<VkDeviceQueueCreateInfo> queue_info;
2253 queue_info.reserve(queue_props.size());
2254 std::vector<std::vector<float>> queue_priorities;
2255 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2256 VkDeviceQueueCreateInfo qi = {};
2257 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2258 qi.pNext = NULL;
2259 qi.queueFamilyIndex = i;
2260 qi.queueCount = queue_props[i].queueCount;
2261 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2262 qi.pQueuePriorities = queue_priorities[i].data();
2263 queue_info.push_back(qi);
2264 }
2265
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002266 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002267
2268 // The sacrificial device object
2269 VkDevice testDevice;
2270 VkDeviceCreateInfo device_create_info = {};
2271 auto features = m_device->phy().features();
2272 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2273 device_create_info.pNext = NULL;
2274 device_create_info.queueCreateInfoCount = queue_info.size();
2275 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002276 device_create_info.enabledLayerCount = 0;
2277 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 device_create_info.pEnabledFeatures = &features;
2279 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2280 ASSERT_VK_SUCCESS(err);
2281
2282 VkFence fence;
2283 VkFenceCreateInfo fence_create_info = {};
2284 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2285 fence_create_info.pNext = NULL;
2286 fence_create_info.flags = 0;
2287 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2288 ASSERT_VK_SUCCESS(err);
2289
2290 // Induce failure by not calling vkDestroyFence
2291 vkDestroyDevice(testDevice, NULL);
2292 m_errorMonitor->VerifyFound();
2293}
2294
2295TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002296 TEST_DESCRIPTION(
2297 "Allocate command buffers from one command pool and "
2298 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301
Tony Barbour1fa09702017-03-16 12:09:08 -06002302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 VkCommandPool command_pool_one;
2304 VkCommandPool command_pool_two;
2305
2306 VkCommandPoolCreateInfo pool_create_info{};
2307 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2308 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2309 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2310
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002311 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002315 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002319 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002323 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
2325 m_errorMonitor->VerifyFound();
2326
2327 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2328 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2329}
2330
2331TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2332 VkResult err;
2333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002334 TEST_DESCRIPTION(
2335 "Allocate descriptor sets from one DS pool and "
2336 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002339
Tony Barbour1fa09702017-03-16 12:09:08 -06002340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2342
2343 VkDescriptorPoolSize ds_type_count = {};
2344 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2345 ds_type_count.descriptorCount = 1;
2346
2347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2349 ds_pool_ci.pNext = NULL;
2350 ds_pool_ci.flags = 0;
2351 ds_pool_ci.maxSets = 1;
2352 ds_pool_ci.poolSizeCount = 1;
2353 ds_pool_ci.pPoolSizes = &ds_type_count;
2354
2355 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002357 ASSERT_VK_SUCCESS(err);
2358
2359 // Create a second descriptor pool
2360 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002361 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002362 ASSERT_VK_SUCCESS(err);
2363
2364 VkDescriptorSetLayoutBinding dsl_binding = {};
2365 dsl_binding.binding = 0;
2366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2367 dsl_binding.descriptorCount = 1;
2368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2369 dsl_binding.pImmutableSamplers = NULL;
2370
2371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2373 ds_layout_ci.pNext = NULL;
2374 ds_layout_ci.bindingCount = 1;
2375 ds_layout_ci.pBindings = &dsl_binding;
2376
2377 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002379 ASSERT_VK_SUCCESS(err);
2380
2381 VkDescriptorSet descriptorSet;
2382 VkDescriptorSetAllocateInfo alloc_info = {};
2383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2384 alloc_info.descriptorSetCount = 1;
2385 alloc_info.descriptorPool = ds_pool_one;
2386 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388 ASSERT_VK_SUCCESS(err);
2389
2390 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2391
2392 m_errorMonitor->VerifyFound();
2393
2394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2395 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2396 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2397}
2398
2399TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002402 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002403
Tony Barbour1fa09702017-03-16 12:09:08 -06002404 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002405
2406 // Pass bogus handle into GetImageMemoryRequirements
2407 VkMemoryRequirements mem_reqs;
2408 uint64_t fakeImageHandle = 0xCADECADE;
2409 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2410
2411 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2412
2413 m_errorMonitor->VerifyFound();
2414}
2415
Mike Schuchardt17838902017-02-21 09:48:06 -07002416TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2417 TEST_DESCRIPTION(
2418 "Try to destroy a render pass object using a device other than the one it was created on. "
2419 "This should generate a distinct error from the invalid handle error.");
2420 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002421 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2423
2424 // Create second device
2425 float priorities[] = {1.0f};
2426 VkDeviceQueueCreateInfo queue_info{};
2427 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2428 queue_info.pNext = NULL;
2429 queue_info.flags = 0;
2430 queue_info.queueFamilyIndex = 0;
2431 queue_info.queueCount = 1;
2432 queue_info.pQueuePriorities = &priorities[0];
2433
2434 VkDeviceCreateInfo device_create_info = {};
2435 auto features = m_device->phy().features();
2436 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2437 device_create_info.pNext = NULL;
2438 device_create_info.queueCreateInfoCount = 1;
2439 device_create_info.pQueueCreateInfos = &queue_info;
2440 device_create_info.enabledLayerCount = 0;
2441 device_create_info.ppEnabledLayerNames = NULL;
2442 device_create_info.pEnabledFeatures = &features;
2443
2444 VkDevice second_device;
2445 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2446
2447 // Try to destroy the renderpass from the first device using the second device
2448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2449 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2450 m_errorMonitor->VerifyFound();
2451
2452 vkDestroyDevice(second_device, NULL);
2453}
2454
Karl Schultz6addd812016-02-02 17:17:23 -07002455TEST_F(VkLayerTest, PipelineNotBound) {
2456 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002458 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002459
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002461
Tony Barbour1fa09702017-03-16 12:09:08 -06002462 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002464
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002465 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2467 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002468
2469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2471 ds_pool_ci.pNext = NULL;
2472 ds_pool_ci.maxSets = 1;
2473 ds_pool_ci.poolSizeCount = 1;
2474 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002475
2476 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002478 ASSERT_VK_SUCCESS(err);
2479
2480 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002481 dsl_binding.binding = 0;
2482 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2483 dsl_binding.descriptorCount = 1;
2484 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2485 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2489 ds_layout_ci.pNext = NULL;
2490 ds_layout_ci.bindingCount = 1;
2491 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495 ASSERT_VK_SUCCESS(err);
2496
2497 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002498 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002499 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002500 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002501 alloc_info.descriptorPool = ds_pool;
2502 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002503 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002504 ASSERT_VK_SUCCESS(err);
2505
2506 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002507 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2508 pipeline_layout_ci.pNext = NULL;
2509 pipeline_layout_ci.setLayoutCount = 1;
2510 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002511
2512 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002513 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002514 ASSERT_VK_SUCCESS(err);
2515
Mark Youngad779052016-01-06 14:26:04 -07002516 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
Tony Barbour552f6c02016-12-21 14:34:07 -07002518 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002521 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002522
Chia-I Wuf7458c52015-10-26 21:10:41 +08002523 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2525 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002526}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002527
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002528TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2529 VkResult err;
2530
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002531 TEST_DESCRIPTION(
2532 "Test validation check for an invalid memory type index "
2533 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534
Tony Barbour1fa09702017-03-16 12:09:08 -06002535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002536
2537 // Create an image, allocate memory, set a bad typeIndex and then try to
2538 // bind it
2539 VkImage image;
2540 VkDeviceMemory mem;
2541 VkMemoryRequirements mem_reqs;
2542 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2543 const int32_t tex_width = 32;
2544 const int32_t tex_height = 32;
2545
2546 VkImageCreateInfo image_create_info = {};
2547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2548 image_create_info.pNext = NULL;
2549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2550 image_create_info.format = tex_format;
2551 image_create_info.extent.width = tex_width;
2552 image_create_info.extent.height = tex_height;
2553 image_create_info.extent.depth = 1;
2554 image_create_info.mipLevels = 1;
2555 image_create_info.arrayLayers = 1;
2556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2559 image_create_info.flags = 0;
2560
2561 VkMemoryAllocateInfo mem_alloc = {};
2562 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2563 mem_alloc.pNext = NULL;
2564 mem_alloc.allocationSize = 0;
2565 mem_alloc.memoryTypeIndex = 0;
2566
2567 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2571 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002572
2573 // Introduce Failure, select invalid TypeIndex
2574 VkPhysicalDeviceMemoryProperties memory_info;
2575
2576 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2577 unsigned int i;
2578 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2579 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2580 mem_alloc.memoryTypeIndex = i;
2581 break;
2582 }
2583 }
2584 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002585 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002586 vkDestroyImage(m_device->device(), image, NULL);
2587 return;
2588 }
2589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002591
2592 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2593 ASSERT_VK_SUCCESS(err);
2594
2595 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2596 (void)err;
2597
2598 m_errorMonitor->VerifyFound();
2599
2600 vkDestroyImage(m_device->device(), image, NULL);
2601 vkFreeMemory(m_device->device(), mem, NULL);
2602}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002603
Karl Schultz6addd812016-02-02 17:17:23 -07002604TEST_F(VkLayerTest, BindInvalidMemory) {
2605 VkResult err;
2606 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002607
Tony Barbour1fa09702017-03-16 12:09:08 -06002608 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002609
Cortf801b982017-01-17 18:10:21 -08002610 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002611 const int32_t tex_width = 256;
2612 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
2614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2616 image_create_info.pNext = NULL;
2617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2618 image_create_info.format = tex_format;
2619 image_create_info.extent.width = tex_width;
2620 image_create_info.extent.height = tex_height;
2621 image_create_info.extent.depth = 1;
2622 image_create_info.mipLevels = 1;
2623 image_create_info.arrayLayers = 1;
2624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2627 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002628
Cortf801b982017-01-17 18:10:21 -08002629 VkBufferCreateInfo buffer_create_info = {};
2630 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2631 buffer_create_info.pNext = NULL;
2632 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002633 buffer_create_info.size = 4 * 1024 * 1024;
2634 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002635 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Cortf801b982017-01-17 18:10:21 -08002637 // Create an image/buffer, allocate memory, free it, and then try to bind it
2638 {
2639 VkImage image = VK_NULL_HANDLE;
2640 VkBuffer buffer = VK_NULL_HANDLE;
2641 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2642 ASSERT_VK_SUCCESS(err);
2643 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2644 ASSERT_VK_SUCCESS(err);
2645 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2646 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2647 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002648
Cortf801b982017-01-17 18:10:21 -08002649 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2650 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2651 image_mem_alloc.allocationSize = image_mem_reqs.size;
2652 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2653 ASSERT_TRUE(pass);
2654 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2655 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2656 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2657 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002658
Cortf801b982017-01-17 18:10:21 -08002659 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2660 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2661 ASSERT_VK_SUCCESS(err);
2662 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2663 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 vkFreeMemory(device(), image_mem, NULL);
2666 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002667
Cortf801b982017-01-17 18:10:21 -08002668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2669 err = vkBindImageMemory(device(), image, image_mem, 0);
2670 (void)err; // This may very well return an error.
2671 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002672
Cortf801b982017-01-17 18:10:21 -08002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2674 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2675 (void)err; // This may very well return an error.
2676 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002677
Cortf801b982017-01-17 18:10:21 -08002678 vkDestroyImage(m_device->device(), image, NULL);
2679 vkDestroyBuffer(m_device->device(), buffer, NULL);
2680 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002681
2682 // Try to bind memory to an object that already has a memory binding
2683 {
2684 VkImage image = VK_NULL_HANDLE;
2685 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2686 ASSERT_VK_SUCCESS(err);
2687 VkBuffer buffer = VK_NULL_HANDLE;
2688 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2689 ASSERT_VK_SUCCESS(err);
2690 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2691 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2692 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2693 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2694 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2695 image_alloc_info.allocationSize = image_mem_reqs.size;
2696 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2697 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2698 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2699 ASSERT_TRUE(pass);
2700 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2701 ASSERT_TRUE(pass);
2702 VkDeviceMemory image_mem, buffer_mem;
2703 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2704 ASSERT_VK_SUCCESS(err);
2705 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2706 ASSERT_VK_SUCCESS(err);
2707
2708 err = vkBindImageMemory(device(), image, image_mem, 0);
2709 ASSERT_VK_SUCCESS(err);
2710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2711 err = vkBindImageMemory(device(), image, image_mem, 0);
2712 (void)err; // This may very well return an error.
2713 m_errorMonitor->VerifyFound();
2714
2715 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2716 ASSERT_VK_SUCCESS(err);
2717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2718 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2719 (void)err; // This may very well return an error.
2720 m_errorMonitor->VerifyFound();
2721
2722 vkFreeMemory(device(), image_mem, NULL);
2723 vkFreeMemory(device(), buffer_mem, NULL);
2724 vkDestroyImage(device(), image, NULL);
2725 vkDestroyBuffer(device(), buffer, NULL);
2726 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002727
Cort Strattonde748202017-02-17 12:50:01 -08002728 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002729 {
2730 VkImage image = VK_NULL_HANDLE;
2731 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2732 ASSERT_VK_SUCCESS(err);
2733 VkBuffer buffer = VK_NULL_HANDLE;
2734 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2735 ASSERT_VK_SUCCESS(err);
2736 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2737 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2738 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2739 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2740 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002741 // Leave some extra space for alignment wiggle room
2742 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002743 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002744 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002745 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2746 ASSERT_TRUE(pass);
2747 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2748 ASSERT_TRUE(pass);
2749 VkDeviceMemory image_mem, buffer_mem;
2750 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2751 ASSERT_VK_SUCCESS(err);
2752 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2753 ASSERT_VK_SUCCESS(err);
2754
Cort Strattonde748202017-02-17 12:50:01 -08002755 // Test unaligned memory offset
2756 {
2757 if (image_mem_reqs.alignment > 1) {
2758 VkDeviceSize image_offset = 1;
2759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2760 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2761 (void)err; // This may very well return an error.
2762 m_errorMonitor->VerifyFound();
2763 }
Cort6c7dff72017-01-27 18:34:50 -08002764
Cort Strattonde748202017-02-17 12:50:01 -08002765 if (buffer_mem_reqs.alignment > 1) {
2766 VkDeviceSize buffer_offset = 1;
2767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2768 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2769 (void)err; // This may very well return an error.
2770 m_errorMonitor->VerifyFound();
2771 }
2772 }
2773
2774 // Test memory offsets outside the memory allocation
2775 {
2776 VkDeviceSize image_offset =
2777 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2779 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2780 (void)err; // This may very well return an error.
2781 m_errorMonitor->VerifyFound();
2782
2783 VkDeviceSize buffer_offset =
2784 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2786 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2787 (void)err; // This may very well return an error.
2788 m_errorMonitor->VerifyFound();
2789 }
2790
2791 // Test memory offsets within the memory allocation, but which leave too little memory for
2792 // the resource.
2793 {
2794 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002795 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2797 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2798 (void)err; // This may very well return an error.
2799 m_errorMonitor->VerifyFound();
2800 }
2801
2802 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2803 if (buffer_offset > 0) {
2804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2805 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2806 (void)err; // This may very well return an error.
2807 m_errorMonitor->VerifyFound();
2808 }
2809 }
Cort6c7dff72017-01-27 18:34:50 -08002810
2811 vkFreeMemory(device(), image_mem, NULL);
2812 vkFreeMemory(device(), buffer_mem, NULL);
2813 vkDestroyImage(device(), image, NULL);
2814 vkDestroyBuffer(device(), buffer, NULL);
2815 }
2816
Cort Stratton4c38bb52017-01-28 13:33:10 -08002817 // Try to bind memory to an object with an invalid memory type
2818 {
2819 VkImage image = VK_NULL_HANDLE;
2820 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2821 ASSERT_VK_SUCCESS(err);
2822 VkBuffer buffer = VK_NULL_HANDLE;
2823 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2824 ASSERT_VK_SUCCESS(err);
2825 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2826 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2827 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2828 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2829 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2830 image_alloc_info.allocationSize = image_mem_reqs.size;
2831 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2832 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002833 // Create a mask of available memory types *not* supported by these resources,
2834 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002835 VkPhysicalDeviceMemoryProperties memory_properties = {};
2836 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002837 VkDeviceMemory image_mem, buffer_mem;
2838
Cort Stratton4c38bb52017-01-28 13:33:10 -08002839 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002840 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002841 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2842 ASSERT_TRUE(pass);
2843 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2844 ASSERT_VK_SUCCESS(err);
2845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2846 err = vkBindImageMemory(device(), image, image_mem, 0);
2847 (void)err; // This may very well return an error.
2848 m_errorMonitor->VerifyFound();
2849 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002850 }
2851
Cort Stratton4c38bb52017-01-28 13:33:10 -08002852 uint32_t buffer_unsupported_mem_type_bits =
2853 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002854 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002855 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2856 ASSERT_TRUE(pass);
2857 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2858 ASSERT_VK_SUCCESS(err);
2859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2860 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2861 (void)err; // This may very well return an error.
2862 m_errorMonitor->VerifyFound();
2863 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002864 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002865
Cort Stratton4c38bb52017-01-28 13:33:10 -08002866 vkDestroyImage(device(), image, NULL);
2867 vkDestroyBuffer(device(), buffer, NULL);
2868 }
2869
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 // Try to bind memory to an image created with sparse memory flags
2871 {
2872 VkImageCreateInfo sparse_image_create_info = image_create_info;
2873 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2874 VkImageFormatProperties image_format_properties = {};
2875 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2876 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2877 sparse_image_create_info.usage, sparse_image_create_info.flags,
2878 &image_format_properties);
2879 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2880 // most likely means sparse formats aren't supported here; skip this test.
2881 } else {
2882 ASSERT_VK_SUCCESS(err);
2883 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002884 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002885 return;
2886 } else {
2887 VkImage sparse_image = VK_NULL_HANDLE;
2888 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2889 ASSERT_VK_SUCCESS(err);
2890 VkMemoryRequirements sparse_mem_reqs = {};
2891 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2892 if (sparse_mem_reqs.memoryTypeBits != 0) {
2893 VkMemoryAllocateInfo sparse_mem_alloc = {};
2894 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2895 sparse_mem_alloc.pNext = NULL;
2896 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2897 sparse_mem_alloc.memoryTypeIndex = 0;
2898 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2899 ASSERT_TRUE(pass);
2900 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2901 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2902 ASSERT_VK_SUCCESS(err);
2903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2904 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2905 // This may very well return an error.
2906 (void)err;
2907 m_errorMonitor->VerifyFound();
2908 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2909 }
2910 vkDestroyImage(m_device->device(), sparse_image, NULL);
2911 }
2912 }
2913 }
2914
2915 // Try to bind memory to a buffer created with sparse memory flags
2916 {
2917 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2918 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2919 if (!m_device->phy().features().sparseResidencyBuffer) {
2920 // most likely means sparse formats aren't supported here; skip this test.
2921 } else {
2922 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2923 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2924 ASSERT_VK_SUCCESS(err);
2925 VkMemoryRequirements sparse_mem_reqs = {};
2926 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2927 if (sparse_mem_reqs.memoryTypeBits != 0) {
2928 VkMemoryAllocateInfo sparse_mem_alloc = {};
2929 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2930 sparse_mem_alloc.pNext = NULL;
2931 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2932 sparse_mem_alloc.memoryTypeIndex = 0;
2933 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2934 ASSERT_TRUE(pass);
2935 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2936 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2937 ASSERT_VK_SUCCESS(err);
2938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2939 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2940 // This may very well return an error.
2941 (void)err;
2942 m_errorMonitor->VerifyFound();
2943 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2944 }
2945 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2946 }
2947 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002948}
2949
Karl Schultz6addd812016-02-02 17:17:23 -07002950TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2951 VkResult err;
2952 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002953
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002955
Tony Barbour1fa09702017-03-16 12:09:08 -06002956 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Karl Schultz6addd812016-02-02 17:17:23 -07002958 // Create an image object, allocate memory, destroy the object and then try
2959 // to bind it
2960 VkImage image;
2961 VkDeviceMemory mem;
2962 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2965 const int32_t tex_width = 32;
2966 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
2968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2970 image_create_info.pNext = NULL;
2971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2972 image_create_info.format = tex_format;
2973 image_create_info.extent.width = tex_width;
2974 image_create_info.extent.height = tex_height;
2975 image_create_info.extent.depth = 1;
2976 image_create_info.mipLevels = 1;
2977 image_create_info.arrayLayers = 1;
2978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2981 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002983 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002984 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2985 mem_alloc.pNext = NULL;
2986 mem_alloc.allocationSize = 0;
2987 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wuf7458c52015-10-26 21:10:41 +08002989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002990 ASSERT_VK_SUCCESS(err);
2991
Karl Schultz6addd812016-02-02 17:17:23 -07002992 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002993
2994 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002995 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002996 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002997
2998 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003000 ASSERT_VK_SUCCESS(err);
3001
3002 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003003 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003004 ASSERT_VK_SUCCESS(err);
3005
3006 // Now Try to bind memory to this destroyed object
3007 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3008 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003009 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003010
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003011 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003012
Chia-I Wuf7458c52015-10-26 21:10:41 +08003013 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003014}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003015
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003016TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3017 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3018
Tony Barbour1fa09702017-03-16 12:09:08 -06003019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3021
3022 VkVertexInputBindingDescription input_binding;
3023 memset(&input_binding, 0, sizeof(input_binding));
3024
3025 VkVertexInputAttributeDescription input_attribs;
3026 memset(&input_attribs, 0, sizeof(input_attribs));
3027
3028 // Pick a really bad format for this purpose and make sure it should fail
3029 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3030 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3031 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003032 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003033 return;
3034 }
3035
3036 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003037 char const *vsSource =
3038 "#version 450\n"
3039 "\n"
3040 "out gl_PerVertex {\n"
3041 " vec4 gl_Position;\n"
3042 "};\n"
3043 "void main(){\n"
3044 " gl_Position = vec4(1);\n"
3045 "}\n";
3046 char const *fsSource =
3047 "#version 450\n"
3048 "\n"
3049 "layout(location=0) out vec4 color;\n"
3050 "void main(){\n"
3051 " color = vec4(1);\n"
3052 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003053
3054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3057
3058 VkPipelineObj pipe(m_device);
3059 pipe.AddColorAttachment();
3060 pipe.AddShader(&vs);
3061 pipe.AddShader(&fs);
3062
3063 pipe.AddVertexInputBindings(&input_binding, 1);
3064 pipe.AddVertexInputAttribs(&input_attribs, 1);
3065
3066 VkDescriptorSetObj descriptorSet(m_device);
3067 descriptorSet.AppendDummy();
3068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3069
3070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3071
3072 m_errorMonitor->VerifyFound();
3073}
3074
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003075TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003076 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003077 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003078
3079 VkMemoryPropertyFlags reqs = 0;
3080 VkImageCreateInfo image_create_info = {};
3081 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3082 image_create_info.pNext = NULL;
3083 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3084 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3085 image_create_info.extent.width = 256;
3086 image_create_info.extent.height = 256;
3087 image_create_info.extent.depth = 1;
3088 image_create_info.mipLevels = 1;
3089 image_create_info.arrayLayers = 1;
3090 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3091 image_create_info.flags = 0;
3092
3093 VkImageBlit blit_region = {};
3094 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3095 blit_region.srcSubresource.baseArrayLayer = 0;
3096 blit_region.srcSubresource.layerCount = 1;
3097 blit_region.srcSubresource.mipLevel = 0;
3098 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3099 blit_region.dstSubresource.baseArrayLayer = 0;
3100 blit_region.dstSubresource.layerCount = 1;
3101 blit_region.dstSubresource.mipLevel = 0;
3102
3103 // Create two images, the source with sampleCount = 2, and attempt to blit
3104 // between them
3105 {
3106 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003111 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003112 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003115 m_errorMonitor->SetDesiredFailureMsg(
3116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3117 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003118 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3119 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_errorMonitor->VerifyFound();
3121 m_commandBuffer->EndCommandBuffer();
3122 }
3123
3124 // Create two images, the dest with sampleCount = 4, and attempt to blit
3125 // between them
3126 {
3127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003128 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003129 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003130 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003131 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003136 m_errorMonitor->SetDesiredFailureMsg(
3137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3138 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003139 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3140 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_errorMonitor->VerifyFound();
3142 m_commandBuffer->EndCommandBuffer();
3143 }
3144
3145 VkBufferImageCopy copy_region = {};
3146 copy_region.bufferRowLength = 128;
3147 copy_region.bufferImageHeight = 128;
3148 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3149 copy_region.imageSubresource.layerCount = 1;
3150 copy_region.imageExtent.height = 64;
3151 copy_region.imageExtent.width = 64;
3152 copy_region.imageExtent.depth = 1;
3153
3154 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3155 // buffer to image
3156 {
3157 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003158 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3159 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003161 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003162 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003163 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003164 m_errorMonitor->SetDesiredFailureMsg(
3165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3166 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003167 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3168 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_errorMonitor->VerifyFound();
3170 m_commandBuffer->EndCommandBuffer();
3171 }
3172
3173 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3174 // image to buffer
3175 {
3176 vk_testing::Buffer dst_buffer;
3177 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3178 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003179 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003180 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003181 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003182 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003183 m_errorMonitor->SetDesiredFailureMsg(
3184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3185 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003187 dst_buffer.handle(), 1, &copy_region);
3188 m_errorMonitor->VerifyFound();
3189 m_commandBuffer->EndCommandBuffer();
3190 }
3191}
3192
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003193TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003194 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003195
3196 VkImageObj src_image(m_device);
3197 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3198 VkImageObj dst_image(m_device);
3199 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3200 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003201 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 -06003202
3203 VkImageBlit blitRegion = {};
3204 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3205 blitRegion.srcSubresource.baseArrayLayer = 0;
3206 blitRegion.srcSubresource.layerCount = 1;
3207 blitRegion.srcSubresource.mipLevel = 0;
3208 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3209 blitRegion.dstSubresource.baseArrayLayer = 0;
3210 blitRegion.dstSubresource.layerCount = 1;
3211 blitRegion.dstSubresource.mipLevel = 0;
3212
Dave Houlton34df4cb2016-12-01 16:43:06 -07003213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3214
3215 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3216 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
3218 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003219 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003220 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3221 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003222
3223 m_errorMonitor->VerifyFound();
3224
Dave Houlton34df4cb2016-12-01 16:43:06 -07003225 // Test should generate 2 VU failures
3226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003230 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3231 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003232
Dave Houlton34df4cb2016-12-01 16:43:06 -07003233 // TODO: Note that this only verifies that at least one of the VU enums was found
3234 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003235 m_errorMonitor->VerifyFound();
3236
Tony Barbour552f6c02016-12-21 14:34:07 -07003237 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238}
3239
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003240TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3241 VkResult err;
3242 bool pass;
3243
3244 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003245 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246
3247 // If w/d/h granularity is 1, test is not meaningful
3248 // TODO: When virtual device limits are available, create a set of limits for this test that
3249 // will always have a granularity of > 1 for w, h, and d
3250 auto index = m_device->graphics_queue_node_index_;
3251 auto queue_family_properties = m_device->phy().queue_properties();
3252
3253 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3254 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3255 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3256 return;
3257 }
3258
3259 // Create two images of different types and try to copy between them
3260 VkImage srcImage;
3261 VkImage dstImage;
3262 VkDeviceMemory srcMem;
3263 VkDeviceMemory destMem;
3264 VkMemoryRequirements memReqs;
3265
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003266 VkImageCreateInfo image_create_info = {};
3267 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3268 image_create_info.pNext = NULL;
3269 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3270 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3271 image_create_info.extent.width = 32;
3272 image_create_info.extent.height = 32;
3273 image_create_info.extent.depth = 1;
3274 image_create_info.mipLevels = 1;
3275 image_create_info.arrayLayers = 4;
3276 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3277 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3278 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3279 image_create_info.flags = 0;
3280
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_VK_SUCCESS(err);
3283
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003284 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003285 ASSERT_VK_SUCCESS(err);
3286
3287 // Allocate memory
3288 VkMemoryAllocateInfo memAlloc = {};
3289 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3290 memAlloc.pNext = NULL;
3291 memAlloc.allocationSize = 0;
3292 memAlloc.memoryTypeIndex = 0;
3293
3294 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3295 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003296 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003297 ASSERT_TRUE(pass);
3298 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3299 ASSERT_VK_SUCCESS(err);
3300
3301 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3302 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003303 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003304 ASSERT_VK_SUCCESS(err);
3305 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3306 ASSERT_VK_SUCCESS(err);
3307
3308 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3309 ASSERT_VK_SUCCESS(err);
3310 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3311 ASSERT_VK_SUCCESS(err);
3312
Tony Barbour552f6c02016-12-21 14:34:07 -07003313 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003314 VkImageCopy copyRegion;
3315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3316 copyRegion.srcSubresource.mipLevel = 0;
3317 copyRegion.srcSubresource.baseArrayLayer = 0;
3318 copyRegion.srcSubresource.layerCount = 1;
3319 copyRegion.srcOffset.x = 0;
3320 copyRegion.srcOffset.y = 0;
3321 copyRegion.srcOffset.z = 0;
3322 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3323 copyRegion.dstSubresource.mipLevel = 0;
3324 copyRegion.dstSubresource.baseArrayLayer = 0;
3325 copyRegion.dstSubresource.layerCount = 1;
3326 copyRegion.dstOffset.x = 0;
3327 copyRegion.dstOffset.y = 0;
3328 copyRegion.dstOffset.z = 0;
3329 copyRegion.extent.width = 1;
3330 copyRegion.extent.height = 1;
3331 copyRegion.extent.depth = 1;
3332
3333 // Introduce failure by setting srcOffset to a bad granularity value
3334 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3336 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003337 m_errorMonitor->VerifyFound();
3338
3339 // Introduce failure by setting extent to a bad granularity value
3340 copyRegion.srcOffset.y = 0;
3341 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3343 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003344 m_errorMonitor->VerifyFound();
3345
3346 // Now do some buffer/image copies
3347 vk_testing::Buffer buffer;
3348 VkMemoryPropertyFlags reqs = 0;
3349 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3350 VkBufferImageCopy region = {};
3351 region.bufferOffset = 0;
3352 region.bufferRowLength = 3;
3353 region.bufferImageHeight = 128;
3354 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3355 region.imageSubresource.layerCount = 1;
3356 region.imageExtent.height = 16;
3357 region.imageExtent.width = 16;
3358 region.imageExtent.depth = 1;
3359 region.imageOffset.x = 0;
3360 region.imageOffset.y = 0;
3361 region.imageOffset.z = 0;
3362
3363 // Introduce failure by setting bufferRowLength to a bad granularity value
3364 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3366 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3367 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003368 m_errorMonitor->VerifyFound();
3369 region.bufferRowLength = 128;
3370
3371 // Introduce failure by setting bufferOffset to a bad granularity value
3372 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3375 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003376 m_errorMonitor->VerifyFound();
3377 region.bufferOffset = 0;
3378
3379 // Introduce failure by setting bufferImageHeight to a bad granularity value
3380 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3383 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003384 m_errorMonitor->VerifyFound();
3385 region.bufferImageHeight = 128;
3386
3387 // Introduce failure by setting imageExtent to a bad granularity value
3388 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3391 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003392 m_errorMonitor->VerifyFound();
3393 region.imageExtent.width = 16;
3394
3395 // Introduce failure by setting imageOffset to a bad granularity value
3396 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3398 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3399 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003400 m_errorMonitor->VerifyFound();
3401
Tony Barbour552f6c02016-12-21 14:34:07 -07003402 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003403
3404 vkDestroyImage(m_device->device(), srcImage, NULL);
3405 vkDestroyImage(m_device->device(), dstImage, NULL);
3406 vkFreeMemory(m_device->device(), srcMem, NULL);
3407 vkFreeMemory(m_device->device(), destMem, NULL);
3408}
3409
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003410TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003411 TEST_DESCRIPTION(
3412 "Submit command buffer created using one queue family and "
3413 "attempt to submit them on a queue created in a different "
3414 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003415
Tony Barbour1fa09702017-03-16 12:09:08 -06003416 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003417
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418 // This test is meaningless unless we have multiple queue families
3419 auto queue_family_properties = m_device->phy().queue_properties();
3420 if (queue_family_properties.size() < 2) {
3421 return;
3422 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // Get safe index of another queue family
3425 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003426 VkQueue other_queue;
3427 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3428
3429 // Record an empty cmd buffer
3430 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3431 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3432 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3433 vkEndCommandBuffer(m_commandBuffer->handle());
3434
3435 // And submit on the wrong queue
3436 VkSubmitInfo submit_info = {};
3437 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3438 submit_info.commandBufferCount = 1;
3439 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003440 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003441
3442 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003443}
3444
Chris Forbes4c24a922016-11-16 08:59:10 +13003445TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003446 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003447
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003448 // There are no attachments, but refer to attachment 0.
3449 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003450 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003452 };
3453
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003454 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003455 VkRenderPass rp;
3456
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003457 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003459 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3460 m_errorMonitor->VerifyFound();
3461}
3462
Chris Forbesa58c4522016-09-28 15:19:39 +13003463TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3464 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003465 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003466
3467 // A renderpass with two subpasses, both writing the same attachment.
3468 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3470 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3471 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003472 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003473 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003474 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3476 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003477 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 VkSubpassDependency dep = {0,
3479 1,
3480 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3481 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3482 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3483 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3484 VK_DEPENDENCY_BY_REGION_BIT};
3485 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003486 VkRenderPass rp;
3487 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3488 ASSERT_VK_SUCCESS(err);
3489
3490 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003491 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 +13003492 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003494 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003495 VkFramebuffer fb;
3496 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3497 ASSERT_VK_SUCCESS(err);
3498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003499 char const *vsSource =
3500 "#version 450\n"
3501 "void main() { gl_Position = vec4(1); }\n";
3502 char const *fsSource =
3503 "#version 450\n"
3504 "layout(location=0) out vec4 color;\n"
3505 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003506
3507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3509 VkPipelineObj pipe(m_device);
3510 pipe.AddColorAttachment();
3511 pipe.AddShader(&vs);
3512 pipe.AddShader(&fs);
3513 VkViewport view_port = {};
3514 m_viewports.push_back(view_port);
3515 pipe.SetViewport(m_viewports);
3516 VkRect2D rect = {};
3517 m_scissors.push_back(rect);
3518 pipe.SetScissor(m_scissors);
3519
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003520 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003521 VkPipelineLayout pl;
3522 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3523 ASSERT_VK_SUCCESS(err);
3524 pipe.CreateVKPipeline(pl, rp);
3525
Tony Barbour552f6c02016-12-21 14:34:07 -07003526 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003527
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3529 nullptr,
3530 rp,
3531 fb,
3532 {{
3533 0, 0,
3534 },
3535 {32, 32}},
3536 0,
3537 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003538
3539 // subtest 1: bind in the wrong subpass
3540 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3541 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003543 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3544 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3545 m_errorMonitor->VerifyFound();
3546
3547 vkCmdEndRenderPass(m_commandBuffer->handle());
3548
3549 // subtest 2: bind in correct subpass, then transition to next subpass
3550 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3551 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3552 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003554 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3555 m_errorMonitor->VerifyFound();
3556
3557 vkCmdEndRenderPass(m_commandBuffer->handle());
3558
Tony Barbour552f6c02016-12-21 14:34:07 -07003559 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003560
3561 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3562 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3563 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3564}
3565
Tony Barbour4e919972016-08-09 13:27:40 -06003566TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003567 TEST_DESCRIPTION(
3568 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3569 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003570 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3572
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3574 "Cannot execute a render pass with renderArea "
3575 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003576
3577 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3578 m_renderPassBeginInfo.renderArea.extent.width = 257;
3579 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003580 m_commandBuffer->BeginCommandBuffer();
3581 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003582 m_errorMonitor->VerifyFound();
3583}
3584
3585TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003586 TEST_DESCRIPTION(
3587 "Generate INDEPENDENT_BLEND by disabling independent "
3588 "blend and then specifying different blend states for two "
3589 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003590 VkPhysicalDeviceFeatures features = {};
3591 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003592 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003593
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3595 "Invalid Pipeline CreateInfo: If independent blend feature not "
3596 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003597
Cody Northropc31a84f2016-08-22 10:41:47 -06003598 VkDescriptorSetObj descriptorSet(m_device);
3599 descriptorSet.AppendDummy();
3600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003601
Cody Northropc31a84f2016-08-22 10:41:47 -06003602 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003603 // Create a renderPass with two color attachments
3604 VkAttachmentReference attachments[2] = {};
3605 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003606 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003607 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3608
3609 VkSubpassDescription subpass = {};
3610 subpass.pColorAttachments = attachments;
3611 subpass.colorAttachmentCount = 2;
3612
3613 VkRenderPassCreateInfo rpci = {};
3614 rpci.subpassCount = 1;
3615 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003616 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003617
Tony Barbourffd60bd2017-03-09 12:04:55 -07003618 VkAttachmentDescription attach_desc[2] = {};
3619 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3620 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3621 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3622 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3623 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3624 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3625 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3626 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003627
Tony Barbourffd60bd2017-03-09 12:04:55 -07003628 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003629 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3630
3631 VkRenderPass renderpass;
3632 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003633 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003634 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003635
Cody Northropc31a84f2016-08-22 10:41:47 -06003636 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3640 att_state2.blendEnable = VK_FALSE;
3641 pipeline.AddColorAttachment(0, &att_state1);
3642 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003643 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003644 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003645 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003646}
3647
Mike Weiblen40b160e2017-02-06 19:21:52 -07003648// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3649TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3650 TEST_DESCRIPTION(
3651 "Create a graphics pipeline that is incompatible with the requirements "
3652 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003653 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654
3655 VkDescriptorSetObj ds_obj(m_device);
3656 ds_obj.AppendDummy();
3657 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3658
3659 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3660
3661 VkPipelineColorBlendAttachmentState att_state1 = {};
3662 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3663 att_state1.blendEnable = VK_TRUE;
3664
3665 VkRenderpassObj rp_obj(m_device);
3666
3667 {
3668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3669 VkPipelineObj pipeline(m_device);
3670 pipeline.AddShader(&vs_obj);
3671 pipeline.AddColorAttachment(0, &att_state1);
3672
3673 VkGraphicsPipelineCreateInfo info = {};
3674 pipeline.InitGraphicsPipelineCreateInfo(&info);
3675 info.pColorBlendState = nullptr;
3676
3677 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3678 m_errorMonitor->VerifyFound();
3679 }
3680}
3681
Chris Forbes26ec2122016-11-29 08:58:33 +13003682#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003683TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3684 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3685 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003686 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003687
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3689 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003690
3691 // Create a renderPass with a single color attachment
3692 VkAttachmentReference attach = {};
3693 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3694 VkSubpassDescription subpass = {};
3695 VkRenderPassCreateInfo rpci = {};
3696 rpci.subpassCount = 1;
3697 rpci.pSubpasses = &subpass;
3698 rpci.attachmentCount = 1;
3699 VkAttachmentDescription attach_desc = {};
3700 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3701 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3702 rpci.pAttachments = &attach_desc;
3703 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3704 VkRenderPass rp;
3705 subpass.pDepthStencilAttachment = &attach;
3706 subpass.pColorAttachments = NULL;
3707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3708 m_errorMonitor->VerifyFound();
3709}
Chris Forbes26ec2122016-11-29 08:58:33 +13003710#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003711
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003712TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003713 TEST_DESCRIPTION(
3714 "Create a framebuffer where a subpass has a preserve "
3715 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003716
Tony Barbour1fa09702017-03-16 12:09:08 -06003717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3719
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003721
3722 VkAttachmentReference color_attach = {};
3723 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3724 color_attach.attachment = 0;
3725 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3726 VkSubpassDescription subpass = {};
3727 subpass.colorAttachmentCount = 1;
3728 subpass.pColorAttachments = &color_attach;
3729 subpass.preserveAttachmentCount = 1;
3730 subpass.pPreserveAttachments = &preserve_attachment;
3731
3732 VkRenderPassCreateInfo rpci = {};
3733 rpci.subpassCount = 1;
3734 rpci.pSubpasses = &subpass;
3735 rpci.attachmentCount = 1;
3736 VkAttachmentDescription attach_desc = {};
3737 attach_desc.format = VK_FORMAT_UNDEFINED;
3738 rpci.pAttachments = &attach_desc;
3739 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3740 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003741 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003742
3743 m_errorMonitor->VerifyFound();
3744
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003745 if (result == VK_SUCCESS) {
3746 vkDestroyRenderPass(m_device->device(), rp, NULL);
3747 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748}
3749
Chris Forbesc5389742016-06-29 11:49:23 +12003750TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 TEST_DESCRIPTION(
3752 "Ensure that CreateRenderPass produces a validation error "
3753 "when the source of a subpass multisample resolve "
3754 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003755
Tony Barbour1fa09702017-03-16 12:09:08 -06003756 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003757
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3759 "Subpass 0 requests multisample resolve from attachment 0 which has "
3760 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003761
3762 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003763 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3765 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3766 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3767 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3768 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003769 };
3770
3771 VkAttachmentReference color = {
3772 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3773 };
3774
3775 VkAttachmentReference resolve = {
3776 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3777 };
3778
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003779 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003781 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003782
3783 VkRenderPass rp;
3784 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3785
3786 m_errorMonitor->VerifyFound();
3787
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003789}
3790
3791TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003792 TEST_DESCRIPTION(
3793 "Ensure CreateRenderPass produces a validation error "
3794 "when a subpass multisample resolve operation is "
3795 "requested, and the destination of that resolve has "
3796 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003797
Tony Barbour1fa09702017-03-16 12:09:08 -06003798 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003799
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3801 "Subpass 0 requests multisample resolve into attachment 1, which "
3802 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003803
3804 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3806 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3807 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3808 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3809 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3810 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003811 };
3812
3813 VkAttachmentReference color = {
3814 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3815 };
3816
3817 VkAttachmentReference resolve = {
3818 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3819 };
3820
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003821 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003823 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003824
3825 VkRenderPass rp;
3826 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3827
3828 m_errorMonitor->VerifyFound();
3829
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003830 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003831}
3832
Chris Forbes3f128ef2016-06-29 14:58:53 +12003833TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003834 TEST_DESCRIPTION(
3835 "Ensure CreateRenderPass produces a validation error "
3836 "when the color and depth attachments used by a subpass "
3837 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003838
Tony Barbour1fa09702017-03-16 12:09:08 -06003839 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003840
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3842 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003843
3844 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003845 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3846 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3847 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3848 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3849 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3850 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003851 };
3852
3853 VkAttachmentReference color[] = {
3854 {
3855 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 },
3857 {
3858 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3859 },
3860 };
3861
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003862 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003864 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003865
3866 VkRenderPass rp;
3867 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3868
3869 m_errorMonitor->VerifyFound();
3870
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003871 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003872}
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003875 TEST_DESCRIPTION(
3876 "Hit errors when attempting to create a framebuffer :\n"
3877 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3878 " 2. Use a color image as depthStencil attachment\n"
3879 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3880 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3881 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3882 " 6. Framebuffer attachment where dimensions don't match\n"
3883 " 7. Framebuffer attachment w/o identity swizzle\n"
3884 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885
Tony Barbour1fa09702017-03-16 12:09:08 -06003886 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3888
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003889 m_errorMonitor->SetDesiredFailureMsg(
3890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3891 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003893 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 VkAttachmentReference attach = {};
3895 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3896 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003897 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898 VkRenderPassCreateInfo rpci = {};
3899 rpci.subpassCount = 1;
3900 rpci.pSubpasses = &subpass;
3901 rpci.attachmentCount = 1;
3902 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003903 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003904 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003905 rpci.pAttachments = &attach_desc;
3906 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3907 VkRenderPass rp;
3908 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3909 ASSERT_VK_SUCCESS(err);
3910
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003911 VkImageView ivs[2];
3912 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3913 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003914 VkFramebufferCreateInfo fb_info = {};
3915 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3916 fb_info.pNext = NULL;
3917 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003918 // Set mis-matching attachmentCount
3919 fb_info.attachmentCount = 2;
3920 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003921 fb_info.width = 100;
3922 fb_info.height = 100;
3923 fb_info.layers = 1;
3924
3925 VkFramebuffer fb;
3926 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3927
3928 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003929 if (err == VK_SUCCESS) {
3930 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3931 }
3932 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003933
3934 // Create a renderPass with a depth-stencil attachment created with
3935 // IMAGE_USAGE_COLOR_ATTACHMENT
3936 // Add our color attachment to pDepthStencilAttachment
3937 subpass.pDepthStencilAttachment = &attach;
3938 subpass.pColorAttachments = NULL;
3939 VkRenderPass rp_ds;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3941 ASSERT_VK_SUCCESS(err);
3942 // Set correct attachment count, but attachment has COLOR usage bit set
3943 fb_info.attachmentCount = 1;
3944 fb_info.renderPass = rp_ds;
3945
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003947 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3948
3949 m_errorMonitor->VerifyFound();
3950 if (err == VK_SUCCESS) {
3951 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3952 }
3953 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954
3955 // Create new renderpass with alternate attachment format from fb
3956 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3957 subpass.pDepthStencilAttachment = NULL;
3958 subpass.pColorAttachments = &attach;
3959 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3960 ASSERT_VK_SUCCESS(err);
3961
3962 // Cause error due to mis-matched formats between rp & fb
3963 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3964 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3966 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003967 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3968
3969 m_errorMonitor->VerifyFound();
3970 if (err == VK_SUCCESS) {
3971 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3972 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003973 vkDestroyRenderPass(m_device->device(), rp, NULL);
3974
3975 // Create new renderpass with alternate sample count from fb
3976 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3977 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
3980
3981 // Cause error due to mis-matched sample count between rp & fb
3982 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003984 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003985 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3986
3987 m_errorMonitor->VerifyFound();
3988 if (err == VK_SUCCESS) {
3989 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3990 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003991
3992 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003993
3994 // Create a custom imageView with non-1 mip levels
3995 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003996 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 -06003997 ASSERT_TRUE(image.initialized());
3998
3999 VkImageView view;
4000 VkImageViewCreateInfo ivci = {};
4001 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4002 ivci.image = image.handle();
4003 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4004 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4005 ivci.subresourceRange.layerCount = 1;
4006 ivci.subresourceRange.baseMipLevel = 0;
4007 // Set level count 2 (only 1 is allowed for FB attachment)
4008 ivci.subresourceRange.levelCount = 2;
4009 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4010 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4011 ASSERT_VK_SUCCESS(err);
4012 // Re-create renderpass to have matching sample count
4013 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4014 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4015 ASSERT_VK_SUCCESS(err);
4016
4017 fb_info.renderPass = rp;
4018 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004026 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004027 // Update view to original color buffer and grow FB dimensions too big
4028 fb_info.pAttachments = ivs;
4029 fb_info.height = 1024;
4030 fb_info.width = 1024;
4031 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004033 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4034
4035 m_errorMonitor->VerifyFound();
4036 if (err == VK_SUCCESS) {
4037 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4038 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004039 // Create view attachment with non-identity swizzle
4040 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4041 ivci.image = image.handle();
4042 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4043 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4044 ivci.subresourceRange.layerCount = 1;
4045 ivci.subresourceRange.baseMipLevel = 0;
4046 ivci.subresourceRange.levelCount = 1;
4047 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4048 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4049 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4050 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4051 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4052 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4053 ASSERT_VK_SUCCESS(err);
4054
4055 fb_info.pAttachments = &view;
4056 fb_info.height = 100;
4057 fb_info.width = 100;
4058 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004059 m_errorMonitor->SetDesiredFailureMsg(
4060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4061 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4063
4064 m_errorMonitor->VerifyFound();
4065 if (err == VK_SUCCESS) {
4066 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4067 }
4068 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004069 // reset attachment to color attachment
4070 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071
4072 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004073 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 fb_info.height = 100;
4075 fb_info.layers = 1;
4076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004077 m_errorMonitor->SetDesiredFailureMsg(
4078 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004079 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4080 "Here are the respective dimensions for attachment");
4081
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4083
4084 m_errorMonitor->VerifyFound();
4085 if (err == VK_SUCCESS) {
4086 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4087 }
4088
4089 // Request fb that exceeds max height
4090 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 fb_info.layers = 1;
4093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004094 m_errorMonitor->SetDesiredFailureMsg(
4095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004096 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4097 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004098 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4099
4100 m_errorMonitor->VerifyFound();
4101 if (err == VK_SUCCESS) {
4102 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4103 }
4104
4105 // Request fb that exceeds max layers
4106 fb_info.width = 100;
4107 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004108 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004110 m_errorMonitor->SetDesiredFailureMsg(
4111 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004112 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4113 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004114 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4115
4116 m_errorMonitor->VerifyFound();
4117 if (err == VK_SUCCESS) {
4118 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4119 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004120
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004121 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004122}
4123
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004124TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004125 TEST_DESCRIPTION(
4126 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4127 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004128
Tony Barbour1fa09702017-03-16 12:09:08 -06004129 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004130 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4132 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133 m_errorMonitor->VerifyFound();
4134}
4135
4136TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004137 TEST_DESCRIPTION(
4138 "Run a simple draw calls to validate failure when Line Width dynamic "
4139 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004140
Tony Barbour1fa09702017-03-16 12:09:08 -06004141 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004142 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Viewport dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
4161TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Scissor dynamic "
4164 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004167 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004171 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004172}
4173
Cortd713fe82016-07-27 09:51:27 -07004174TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Blend Constants "
4177 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4182 "Dynamic blend constants state not set for this command buffer");
4183 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004184 m_errorMonitor->VerifyFound();
4185}
4186
4187TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004188 TEST_DESCRIPTION(
4189 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4190 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004191
Tony Barbour1fa09702017-03-16 12:09:08 -06004192 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004193 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004194 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004195 return;
4196 }
4197 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic depth bounds state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4207 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil read mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4220 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil write mask state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004228}
4229
4230TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004231 TEST_DESCRIPTION(
4232 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4233 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004234
Tony Barbour1fa09702017-03-16 12:09:08 -06004235 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004236 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4238 "Dynamic stencil reference state not set for this command buffer");
4239 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004240 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004241}
4242
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004243TEST_F(VkLayerTest, IndexBufferNotBound) {
4244 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004245
Tony Barbour1fa09702017-03-16 12:09:08 -06004246 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4248 "Index buffer object not bound to this command buffer when Indexed ");
4249 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004250 m_errorMonitor->VerifyFound();
4251}
4252
Karl Schultz6addd812016-02-02 17:17:23 -07004253TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4255 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4256 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004257
Tony Barbour1fa09702017-03-16 12:09:08 -06004258 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004259 ASSERT_NO_FATAL_FAILURE(InitViewport());
4260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4261
Karl Schultz6addd812016-02-02 17:17:23 -07004262 // We luck out b/c by default the framework creates CB w/ the
4263 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004264 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004266 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004267
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004268 // Bypass framework since it does the waits automatically
4269 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004270 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004271 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4272 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004273 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004274 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004275 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004276 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004277 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004278 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004279 submit_info.pSignalSemaphores = NULL;
4280
Chris Forbes40028e22016-06-13 09:59:34 +12004281 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004282 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004283 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004284
Karl Schultz6addd812016-02-02 17:17:23 -07004285 // Cause validation error by re-submitting cmd buffer that should only be
4286 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004287 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004288 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004290 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004291}
4292
Karl Schultz6addd812016-02-02 17:17:23 -07004293TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004294 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004295 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004296
Tony Barbour1fa09702017-03-16 12:09:08 -06004297 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004299
Karl Schultz6addd812016-02-02 17:17:23 -07004300 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4301 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004302 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004303 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004304 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004305
4306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4308 ds_pool_ci.pNext = NULL;
4309 ds_pool_ci.flags = 0;
4310 ds_pool_ci.maxSets = 1;
4311 ds_pool_ci.poolSizeCount = 1;
4312 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004313
4314 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004315 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004316 ASSERT_VK_SUCCESS(err);
4317
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004318 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4319 dsl_binding_samp.binding = 0;
4320 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4321 dsl_binding_samp.descriptorCount = 1;
4322 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4323 dsl_binding_samp.pImmutableSamplers = NULL;
4324
4325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4327 ds_layout_ci.pNext = NULL;
4328 ds_layout_ci.bindingCount = 1;
4329 ds_layout_ci.pBindings = &dsl_binding_samp;
4330
4331 VkDescriptorSetLayout ds_layout_samp;
4332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4333 ASSERT_VK_SUCCESS(err);
4334
4335 // Try to allocate 2 sets when pool only has 1 set
4336 VkDescriptorSet descriptor_sets[2];
4337 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4338 VkDescriptorSetAllocateInfo alloc_info = {};
4339 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4340 alloc_info.descriptorSetCount = 2;
4341 alloc_info.descriptorPool = ds_pool;
4342 alloc_info.pSetLayouts = set_layouts;
4343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4345 m_errorMonitor->VerifyFound();
4346
4347 alloc_info.descriptorSetCount = 1;
4348 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004349 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004350 dsl_binding.binding = 0;
4351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4352 dsl_binding.descriptorCount = 1;
4353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4354 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Karl Schultz6addd812016-02-02 17:17:23 -07004356 ds_layout_ci.bindingCount = 1;
4357 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004358
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 VkDescriptorSetLayout ds_layout_ub;
4360 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361 ASSERT_VK_SUCCESS(err);
4362
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004363 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004364 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004365 alloc_info.pSetLayouts = &ds_layout_ub;
4366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004368
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004369 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004370
Karl Schultz2825ab92016-12-02 08:23:14 -07004371 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004372 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004374}
4375
Karl Schultz6addd812016-02-02 17:17:23 -07004376TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4377 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004378
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004380
Tony Barbour1fa09702017-03-16 12:09:08 -06004381 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004383
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004384 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4386 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004387
4388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4390 ds_pool_ci.pNext = NULL;
4391 ds_pool_ci.maxSets = 1;
4392 ds_pool_ci.poolSizeCount = 1;
4393 ds_pool_ci.flags = 0;
4394 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4395 // app can only call vkResetDescriptorPool on this pool.;
4396 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004397
4398 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004399 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004400 ASSERT_VK_SUCCESS(err);
4401
4402 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004403 dsl_binding.binding = 0;
4404 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4405 dsl_binding.descriptorCount = 1;
4406 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4407 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004408
4409 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004410 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4411 ds_layout_ci.pNext = NULL;
4412 ds_layout_ci.bindingCount = 1;
4413 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004414
4415 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004417 ASSERT_VK_SUCCESS(err);
4418
4419 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004420 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004421 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004422 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004423 alloc_info.descriptorPool = ds_pool;
4424 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004425 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004426 ASSERT_VK_SUCCESS(err);
4427
4428 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004429 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004430
Chia-I Wuf7458c52015-10-26 21:10:41 +08004431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004433}
4434
Karl Schultz6addd812016-02-02 17:17:23 -07004435TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004436 // Attempt to clear Descriptor Pool with bad object.
4437 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004438
Tony Barbour1fa09702017-03-16 12:09:08 -06004439 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004441 uint64_t fake_pool_handle = 0xbaad6001;
4442 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4443 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004445}
4446
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004447TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004448 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4449 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004450 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004451 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004452
4453 uint64_t fake_set_handle = 0xbaad6001;
4454 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004455 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004457
Tony Barbour1fa09702017-03-16 12:09:08 -06004458 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004459
4460 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4461 layout_bindings[0].binding = 0;
4462 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4463 layout_bindings[0].descriptorCount = 1;
4464 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4465 layout_bindings[0].pImmutableSamplers = NULL;
4466
4467 VkDescriptorSetLayout descriptor_set_layout;
4468 VkDescriptorSetLayoutCreateInfo dslci = {};
4469 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4470 dslci.pNext = NULL;
4471 dslci.bindingCount = 1;
4472 dslci.pBindings = layout_bindings;
4473 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004474 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475
4476 VkPipelineLayout pipeline_layout;
4477 VkPipelineLayoutCreateInfo plci = {};
4478 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4479 plci.pNext = NULL;
4480 plci.setLayoutCount = 1;
4481 plci.pSetLayouts = &descriptor_set_layout;
4482 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004483 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004484
Tony Barbour552f6c02016-12-21 14:34:07 -07004485 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004486 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4487 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004489 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004490 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4491 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004492}
4493
Karl Schultz6addd812016-02-02 17:17:23 -07004494TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004495 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4496 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004497 uint64_t fake_layout_handle = 0xbaad6001;
4498 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004500 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004501 VkPipelineLayout pipeline_layout;
4502 VkPipelineLayoutCreateInfo plci = {};
4503 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4504 plci.pNext = NULL;
4505 plci.setLayoutCount = 1;
4506 plci.pSetLayouts = &bad_layout;
4507 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4508
4509 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004510}
4511
Mark Muellerd4914412016-06-13 17:52:06 -06004512TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004513 TEST_DESCRIPTION(
4514 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4515 "1) A uniform buffer update must have a valid buffer index."
4516 "2) When using an array of descriptors in a single WriteDescriptor,"
4517 " the descriptor types and stageflags must all be the same."
4518 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004519
Mike Weiblena6666382017-01-05 15:16:11 -07004520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004521
Tony Barbour1fa09702017-03-16 12:09:08 -06004522 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004523 VkDescriptorPoolSize ds_type_count[4] = {};
4524 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4525 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004526 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004527 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004528 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004529 ds_type_count[2].descriptorCount = 1;
4530 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4531 ds_type_count[3].descriptorCount = 1;
4532
4533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4535 ds_pool_ci.maxSets = 1;
4536 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4537 ds_pool_ci.pPoolSizes = ds_type_count;
4538
4539 VkDescriptorPool ds_pool;
4540 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4541 ASSERT_VK_SUCCESS(err);
4542
Mark Muellerb9896722016-06-16 09:54:29 -06004543 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004544 layout_binding[0].binding = 0;
4545 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4546 layout_binding[0].descriptorCount = 1;
4547 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4548 layout_binding[0].pImmutableSamplers = NULL;
4549
4550 layout_binding[1].binding = 1;
4551 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4552 layout_binding[1].descriptorCount = 1;
4553 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4554 layout_binding[1].pImmutableSamplers = NULL;
4555
4556 VkSamplerCreateInfo sampler_ci = {};
4557 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4558 sampler_ci.pNext = NULL;
4559 sampler_ci.magFilter = VK_FILTER_NEAREST;
4560 sampler_ci.minFilter = VK_FILTER_NEAREST;
4561 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4562 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4563 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4564 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4565 sampler_ci.mipLodBias = 1.0;
4566 sampler_ci.anisotropyEnable = VK_FALSE;
4567 sampler_ci.maxAnisotropy = 1;
4568 sampler_ci.compareEnable = VK_FALSE;
4569 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4570 sampler_ci.minLod = 1.0;
4571 sampler_ci.maxLod = 1.0;
4572 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4573 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4574 VkSampler sampler;
4575
4576 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4577 ASSERT_VK_SUCCESS(err);
4578
4579 layout_binding[2].binding = 2;
4580 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4581 layout_binding[2].descriptorCount = 1;
4582 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4583 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4584
Mark Muellerd4914412016-06-13 17:52:06 -06004585 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4586 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4587 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4588 ds_layout_ci.pBindings = layout_binding;
4589 VkDescriptorSetLayout ds_layout;
4590 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4591 ASSERT_VK_SUCCESS(err);
4592
4593 VkDescriptorSetAllocateInfo alloc_info = {};
4594 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4595 alloc_info.descriptorSetCount = 1;
4596 alloc_info.descriptorPool = ds_pool;
4597 alloc_info.pSetLayouts = &ds_layout;
4598 VkDescriptorSet descriptorSet;
4599 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4600 ASSERT_VK_SUCCESS(err);
4601
4602 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4603 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4604 pipeline_layout_ci.pNext = NULL;
4605 pipeline_layout_ci.setLayoutCount = 1;
4606 pipeline_layout_ci.pSetLayouts = &ds_layout;
4607
4608 VkPipelineLayout pipeline_layout;
4609 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4610 ASSERT_VK_SUCCESS(err);
4611
Mark Mueller5c838ce2016-06-16 09:54:29 -06004612 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004613 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4614 descriptor_write.dstSet = descriptorSet;
4615 descriptor_write.dstBinding = 0;
4616 descriptor_write.descriptorCount = 1;
4617 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4618
Mark Mueller5c838ce2016-06-16 09:54:29 -06004619 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004620 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4621 m_errorMonitor->VerifyFound();
4622
4623 // Create a buffer to update the descriptor with
4624 uint32_t qfi = 0;
4625 VkBufferCreateInfo buffCI = {};
4626 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4627 buffCI.size = 1024;
4628 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4629 buffCI.queueFamilyIndexCount = 1;
4630 buffCI.pQueueFamilyIndices = &qfi;
4631
4632 VkBuffer dyub;
4633 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4634 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004635
Tony Barboure132c5f2016-12-12 11:50:20 -07004636 VkDeviceMemory mem;
4637 VkMemoryRequirements mem_reqs;
4638 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4639
4640 VkMemoryAllocateInfo mem_alloc_info = {};
4641 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4642 mem_alloc_info.allocationSize = mem_reqs.size;
4643 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4644 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4645 ASSERT_VK_SUCCESS(err);
4646
4647 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4648 ASSERT_VK_SUCCESS(err);
4649
4650 VkDescriptorBufferInfo buffInfo[2] = {};
4651 buffInfo[0].buffer = dyub;
4652 buffInfo[0].offset = 0;
4653 buffInfo[0].range = 1024;
4654 buffInfo[1].buffer = dyub;
4655 buffInfo[1].offset = 0;
4656 buffInfo[1].range = 1024;
4657 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004658 descriptor_write.descriptorCount = 2;
4659
Mark Mueller5c838ce2016-06-16 09:54:29 -06004660 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Mueller5c838ce2016-06-16 09:54:29 -06004665 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4666 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004667 descriptor_write.dstBinding = 1;
4668 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004669
Mark Mueller5c838ce2016-06-16 09:54:29 -06004670 // Make pImageInfo index non-null to avoid complaints of it missing
4671 VkDescriptorImageInfo imageInfo = {};
4672 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4673 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004675 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4676 m_errorMonitor->VerifyFound();
4677
Mark Muellerd4914412016-06-13 17:52:06 -06004678 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004679 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004680 vkDestroySampler(m_device->device(), sampler, NULL);
4681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4682 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4684}
4685
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004687 TEST_DESCRIPTION(
4688 "Attempt to draw with a command buffer that is invalid "
4689 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004690 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004691
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004692 VkBuffer buffer;
4693 VkDeviceMemory mem;
4694 VkMemoryRequirements mem_reqs;
4695
4696 VkBufferCreateInfo buf_info = {};
4697 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004698 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004699 buf_info.size = 256;
4700 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4701 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4702 ASSERT_VK_SUCCESS(err);
4703
4704 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4705
4706 VkMemoryAllocateInfo alloc_info = {};
4707 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4708 alloc_info.allocationSize = 256;
4709 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004710 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 -06004711 if (!pass) {
4712 vkDestroyBuffer(m_device->device(), buffer, NULL);
4713 return;
4714 }
4715 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4716 ASSERT_VK_SUCCESS(err);
4717
4718 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4719 ASSERT_VK_SUCCESS(err);
4720
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004721 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004722 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004723 m_commandBuffer->EndCommandBuffer();
4724
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004726 // Destroy buffer dependency prior to submit to cause ERROR
4727 vkDestroyBuffer(m_device->device(), buffer, NULL);
4728
4729 VkSubmitInfo submit_info = {};
4730 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4731 submit_info.commandBufferCount = 1;
4732 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4733 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4734
4735 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004736 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004737 vkFreeMemory(m_device->handle(), mem, NULL);
4738}
4739
Tobin Ehlisea413442016-09-28 10:23:59 -06004740TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4741 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4742
Tony Barbour1fa09702017-03-16 12:09:08 -06004743 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4745
4746 VkDescriptorPoolSize ds_type_count;
4747 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4748 ds_type_count.descriptorCount = 1;
4749
4750 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4751 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4752 ds_pool_ci.maxSets = 1;
4753 ds_pool_ci.poolSizeCount = 1;
4754 ds_pool_ci.pPoolSizes = &ds_type_count;
4755
4756 VkDescriptorPool ds_pool;
4757 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4758 ASSERT_VK_SUCCESS(err);
4759
4760 VkDescriptorSetLayoutBinding layout_binding;
4761 layout_binding.binding = 0;
4762 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4763 layout_binding.descriptorCount = 1;
4764 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4765 layout_binding.pImmutableSamplers = NULL;
4766
4767 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4768 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4769 ds_layout_ci.bindingCount = 1;
4770 ds_layout_ci.pBindings = &layout_binding;
4771 VkDescriptorSetLayout ds_layout;
4772 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4773 ASSERT_VK_SUCCESS(err);
4774
4775 VkDescriptorSetAllocateInfo alloc_info = {};
4776 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4777 alloc_info.descriptorSetCount = 1;
4778 alloc_info.descriptorPool = ds_pool;
4779 alloc_info.pSetLayouts = &ds_layout;
4780 VkDescriptorSet descriptor_set;
4781 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4782 ASSERT_VK_SUCCESS(err);
4783
4784 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4785 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4786 pipeline_layout_ci.pNext = NULL;
4787 pipeline_layout_ci.setLayoutCount = 1;
4788 pipeline_layout_ci.pSetLayouts = &ds_layout;
4789
4790 VkPipelineLayout pipeline_layout;
4791 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4792 ASSERT_VK_SUCCESS(err);
4793
4794 VkBuffer buffer;
4795 uint32_t queue_family_index = 0;
4796 VkBufferCreateInfo buffer_create_info = {};
4797 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4798 buffer_create_info.size = 1024;
4799 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4800 buffer_create_info.queueFamilyIndexCount = 1;
4801 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4802
4803 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4804 ASSERT_VK_SUCCESS(err);
4805
4806 VkMemoryRequirements memory_reqs;
4807 VkDeviceMemory buffer_memory;
4808
4809 VkMemoryAllocateInfo memory_info = {};
4810 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4811 memory_info.allocationSize = 0;
4812 memory_info.memoryTypeIndex = 0;
4813
4814 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4815 memory_info.allocationSize = memory_reqs.size;
4816 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4817 ASSERT_TRUE(pass);
4818
4819 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4820 ASSERT_VK_SUCCESS(err);
4821 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4822 ASSERT_VK_SUCCESS(err);
4823
4824 VkBufferView view;
4825 VkBufferViewCreateInfo bvci = {};
4826 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4827 bvci.buffer = buffer;
4828 bvci.format = VK_FORMAT_R8_UNORM;
4829 bvci.range = VK_WHOLE_SIZE;
4830
4831 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4832 ASSERT_VK_SUCCESS(err);
4833
4834 VkWriteDescriptorSet descriptor_write = {};
4835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4836 descriptor_write.dstSet = descriptor_set;
4837 descriptor_write.dstBinding = 0;
4838 descriptor_write.descriptorCount = 1;
4839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4840 descriptor_write.pTexelBufferView = &view;
4841
4842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4843
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004844 char const *vsSource =
4845 "#version 450\n"
4846 "\n"
4847 "out gl_PerVertex { \n"
4848 " vec4 gl_Position;\n"
4849 "};\n"
4850 "void main(){\n"
4851 " gl_Position = vec4(1);\n"
4852 "}\n";
4853 char const *fsSource =
4854 "#version 450\n"
4855 "\n"
4856 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4857 "layout(location=0) out vec4 x;\n"
4858 "void main(){\n"
4859 " x = imageLoad(s, 0);\n"
4860 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4863 VkPipelineObj pipe(m_device);
4864 pipe.AddShader(&vs);
4865 pipe.AddShader(&fs);
4866 pipe.AddColorAttachment();
4867 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4868
Tobin Ehlisea413442016-09-28 10:23:59 -06004869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4870
Tony Barbour552f6c02016-12-21 14:34:07 -07004871 m_commandBuffer->BeginCommandBuffer();
4872 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4873
Tobin Ehlisea413442016-09-28 10:23:59 -06004874 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4875 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4876 VkRect2D scissor = {{0, 0}, {16, 16}};
4877 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4878 // Bind pipeline to cmd buffer
4879 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4880 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4881 &descriptor_set, 0, nullptr);
4882 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004883 m_commandBuffer->EndRenderPass();
4884 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004885
4886 // Delete BufferView in order to invalidate cmd buffer
4887 vkDestroyBufferView(m_device->device(), view, NULL);
4888 // Now attempt submit of cmd buffer
4889 VkSubmitInfo submit_info = {};
4890 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4891 submit_info.commandBufferCount = 1;
4892 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4893 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4894 m_errorMonitor->VerifyFound();
4895
4896 // Clean-up
4897 vkDestroyBuffer(m_device->device(), buffer, NULL);
4898 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4899 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4900 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4901 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4902}
4903
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004904TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004905 TEST_DESCRIPTION(
4906 "Attempt to draw with a command buffer that is invalid "
4907 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004908 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004909
4910 VkImage image;
4911 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4912 VkImageCreateInfo image_create_info = {};
4913 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4914 image_create_info.pNext = NULL;
4915 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4916 image_create_info.format = tex_format;
4917 image_create_info.extent.width = 32;
4918 image_create_info.extent.height = 32;
4919 image_create_info.extent.depth = 1;
4920 image_create_info.mipLevels = 1;
4921 image_create_info.arrayLayers = 1;
4922 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4923 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004924 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004925 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004926 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004927 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004928 // Have to bind memory to image before recording cmd in cmd buffer using it
4929 VkMemoryRequirements mem_reqs;
4930 VkDeviceMemory image_mem;
4931 bool pass;
4932 VkMemoryAllocateInfo mem_alloc = {};
4933 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4934 mem_alloc.pNext = NULL;
4935 mem_alloc.memoryTypeIndex = 0;
4936 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4937 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004938 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004939 ASSERT_TRUE(pass);
4940 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4941 ASSERT_VK_SUCCESS(err);
4942 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4943 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004944
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004946 VkClearColorValue ccv;
4947 ccv.float32[0] = 1.0f;
4948 ccv.float32[1] = 1.0f;
4949 ccv.float32[2] = 1.0f;
4950 ccv.float32[3] = 1.0f;
4951 VkImageSubresourceRange isr = {};
4952 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004953 isr.baseArrayLayer = 0;
4954 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004955 isr.layerCount = 1;
4956 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004957 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004958 m_commandBuffer->EndCommandBuffer();
4959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004961 // Destroy image dependency prior to submit to cause ERROR
4962 vkDestroyImage(m_device->device(), image, NULL);
4963
4964 VkSubmitInfo submit_info = {};
4965 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4966 submit_info.commandBufferCount = 1;
4967 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4968 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4969
4970 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004971 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004972}
4973
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004974TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004975 TEST_DESCRIPTION(
4976 "Attempt to draw with a command buffer that is invalid "
4977 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004978 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004979 VkFormatProperties format_properties;
4980 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004981 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4982 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004983 return;
4984 }
4985
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4987
4988 VkImageCreateInfo image_ci = {};
4989 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4990 image_ci.pNext = NULL;
4991 image_ci.imageType = VK_IMAGE_TYPE_2D;
4992 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4993 image_ci.extent.width = 32;
4994 image_ci.extent.height = 32;
4995 image_ci.extent.depth = 1;
4996 image_ci.mipLevels = 1;
4997 image_ci.arrayLayers = 1;
4998 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4999 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005000 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005001 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5002 image_ci.flags = 0;
5003 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005005
5006 VkMemoryRequirements memory_reqs;
5007 VkDeviceMemory image_memory;
5008 bool pass;
5009 VkMemoryAllocateInfo memory_info = {};
5010 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5011 memory_info.pNext = NULL;
5012 memory_info.allocationSize = 0;
5013 memory_info.memoryTypeIndex = 0;
5014 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5015 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005016 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005017 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005018 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005019 ASSERT_VK_SUCCESS(err);
5020 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5021 ASSERT_VK_SUCCESS(err);
5022
5023 VkImageViewCreateInfo ivci = {
5024 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5025 nullptr,
5026 0,
5027 image,
5028 VK_IMAGE_VIEW_TYPE_2D,
5029 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005030 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005031 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5032 };
5033 VkImageView view;
5034 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5035 ASSERT_VK_SUCCESS(err);
5036
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005037 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 VkFramebuffer fb;
5039 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5040 ASSERT_VK_SUCCESS(err);
5041
5042 // Just use default renderpass with our framebuffer
5043 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005044 m_renderPassBeginInfo.renderArea.extent.width = 32;
5045 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005046 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005047 m_commandBuffer->BeginCommandBuffer();
5048 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5049 m_commandBuffer->EndRenderPass();
5050 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005051 // Destroy image attached to framebuffer to invalidate cmd buffer
5052 vkDestroyImage(m_device->device(), image, NULL);
5053 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005055 QueueCommandBuffer(false);
5056 m_errorMonitor->VerifyFound();
5057
5058 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5059 vkDestroyImageView(m_device->device(), view, nullptr);
5060 vkFreeMemory(m_device->device(), image_memory, nullptr);
5061}
5062
Tobin Ehlisb329f992016-10-12 13:20:29 -06005063TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5064 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005065 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005066 VkFormatProperties format_properties;
5067 VkResult err = VK_SUCCESS;
5068 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5069
Tobin Ehlisb329f992016-10-12 13:20:29 -06005070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5071
5072 VkImageObj image(m_device);
5073 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5074 ASSERT_TRUE(image.initialized());
5075 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5076
5077 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5078 VkFramebuffer fb;
5079 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5080 ASSERT_VK_SUCCESS(err);
5081
5082 // Just use default renderpass with our framebuffer
5083 m_renderPassBeginInfo.framebuffer = fb;
5084 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005085 m_commandBuffer->BeginCommandBuffer();
5086 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5087 m_commandBuffer->EndRenderPass();
5088 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005089 // Submit cmd buffer to put it in-flight
5090 VkSubmitInfo submit_info = {};
5091 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5092 submit_info.commandBufferCount = 1;
5093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5094 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5095 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5098 m_errorMonitor->VerifyFound();
5099 // Wait for queue to complete so we can safely destroy everything
5100 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005101 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5102 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005103 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5104}
5105
Tobin Ehlis88becd72016-09-21 14:33:41 -06005106TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5107 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005108 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005109 VkFormatProperties format_properties;
5110 VkResult err = VK_SUCCESS;
5111 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005112
Tobin Ehlis88becd72016-09-21 14:33:41 -06005113 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5114
5115 VkImageCreateInfo image_ci = {};
5116 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5117 image_ci.pNext = NULL;
5118 image_ci.imageType = VK_IMAGE_TYPE_2D;
5119 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5120 image_ci.extent.width = 256;
5121 image_ci.extent.height = 256;
5122 image_ci.extent.depth = 1;
5123 image_ci.mipLevels = 1;
5124 image_ci.arrayLayers = 1;
5125 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5126 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005127 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005128 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5129 image_ci.flags = 0;
5130 VkImage image;
5131 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5132
5133 VkMemoryRequirements memory_reqs;
5134 VkDeviceMemory image_memory;
5135 bool pass;
5136 VkMemoryAllocateInfo memory_info = {};
5137 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5138 memory_info.pNext = NULL;
5139 memory_info.allocationSize = 0;
5140 memory_info.memoryTypeIndex = 0;
5141 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5142 memory_info.allocationSize = memory_reqs.size;
5143 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5144 ASSERT_TRUE(pass);
5145 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5146 ASSERT_VK_SUCCESS(err);
5147 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5148 ASSERT_VK_SUCCESS(err);
5149
5150 VkImageViewCreateInfo ivci = {
5151 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5152 nullptr,
5153 0,
5154 image,
5155 VK_IMAGE_VIEW_TYPE_2D,
5156 VK_FORMAT_B8G8R8A8_UNORM,
5157 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5158 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5159 };
5160 VkImageView view;
5161 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5162 ASSERT_VK_SUCCESS(err);
5163
5164 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5165 VkFramebuffer fb;
5166 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5167 ASSERT_VK_SUCCESS(err);
5168
5169 // Just use default renderpass with our framebuffer
5170 m_renderPassBeginInfo.framebuffer = fb;
5171 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005172 m_commandBuffer->BeginCommandBuffer();
5173 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5174 m_commandBuffer->EndRenderPass();
5175 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005176 // Submit cmd buffer to put it (and attached imageView) in-flight
5177 VkSubmitInfo submit_info = {};
5178 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5179 submit_info.commandBufferCount = 1;
5180 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5181 // Submit cmd buffer to put framebuffer and children in-flight
5182 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5183 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005185 vkDestroyImage(m_device->device(), image, NULL);
5186 m_errorMonitor->VerifyFound();
5187 // Wait for queue to complete so we can safely destroy image and other objects
5188 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005189 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5190 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005191 vkDestroyImage(m_device->device(), image, NULL);
5192 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5193 vkDestroyImageView(m_device->device(), view, nullptr);
5194 vkFreeMemory(m_device->device(), image_memory, nullptr);
5195}
5196
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005197TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5198 TEST_DESCRIPTION("Delete in-use renderPass.");
5199
Tony Barbour1fa09702017-03-16 12:09:08 -06005200 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5202
5203 // Create simple renderpass
5204 VkAttachmentReference attach = {};
5205 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5206 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005207 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005208 subpass.pColorAttachments = &attach;
5209 VkRenderPassCreateInfo rpci = {};
5210 rpci.subpassCount = 1;
5211 rpci.pSubpasses = &subpass;
5212 rpci.attachmentCount = 1;
5213 VkAttachmentDescription attach_desc = {};
5214 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5215 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5216 rpci.pAttachments = &attach_desc;
5217 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5218 VkRenderPass rp;
5219 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5220 ASSERT_VK_SUCCESS(err);
5221
5222 // Create a pipeline that uses the given renderpass
5223 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5224 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5225
5226 VkPipelineLayout pipeline_layout;
5227 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5228 ASSERT_VK_SUCCESS(err);
5229
5230 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5231 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5232 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005233 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005234 vp_state_ci.pViewports = &vp;
5235 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005236 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005237 vp_state_ci.pScissors = &scissors;
5238
5239 VkPipelineShaderStageCreateInfo shaderStages[2];
5240 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5241
5242 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005243 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 -06005244 // but add it to be able to run on more devices
5245 shaderStages[0] = vs.GetStageCreateInfo();
5246 shaderStages[1] = fs.GetStageCreateInfo();
5247
5248 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5249 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5250
5251 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5252 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5253 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5254
5255 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5256 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5257 rs_ci.rasterizerDiscardEnable = true;
5258 rs_ci.lineWidth = 1.0f;
5259
5260 VkPipelineColorBlendAttachmentState att = {};
5261 att.blendEnable = VK_FALSE;
5262 att.colorWriteMask = 0xf;
5263
5264 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5265 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5266 cb_ci.attachmentCount = 1;
5267 cb_ci.pAttachments = &att;
5268
5269 VkGraphicsPipelineCreateInfo gp_ci = {};
5270 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5271 gp_ci.stageCount = 2;
5272 gp_ci.pStages = shaderStages;
5273 gp_ci.pVertexInputState = &vi_ci;
5274 gp_ci.pInputAssemblyState = &ia_ci;
5275 gp_ci.pViewportState = &vp_state_ci;
5276 gp_ci.pRasterizationState = &rs_ci;
5277 gp_ci.pColorBlendState = &cb_ci;
5278 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5279 gp_ci.layout = pipeline_layout;
5280 gp_ci.renderPass = rp;
5281
5282 VkPipelineCacheCreateInfo pc_ci = {};
5283 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5284
Dave Houlton756e6742017-03-23 14:33:22 -06005285 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005286 VkPipeline pipeline;
5287 VkPipelineCache pipe_cache;
5288 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5289 ASSERT_VK_SUCCESS(err);
5290
5291 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5292 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005293
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005294 // Bind pipeline to cmd buffer, will also bind renderpass
5295 m_commandBuffer->BeginCommandBuffer();
5296 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5297 m_commandBuffer->EndCommandBuffer();
5298
5299 VkSubmitInfo submit_info = {};
5300 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5301 submit_info.commandBufferCount = 1;
5302 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5303 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005304 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005305
5306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5307 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5308 m_errorMonitor->VerifyFound();
5309
5310 // Wait for queue to complete so we can safely destroy everything
5311 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005312 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5313 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5315 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5316 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5317 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5318}
5319
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005320TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005323
5324 VkImage image;
5325 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5326 VkImageCreateInfo image_create_info = {};
5327 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5328 image_create_info.pNext = NULL;
5329 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5330 image_create_info.format = tex_format;
5331 image_create_info.extent.width = 32;
5332 image_create_info.extent.height = 32;
5333 image_create_info.extent.depth = 1;
5334 image_create_info.mipLevels = 1;
5335 image_create_info.arrayLayers = 1;
5336 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5337 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005338 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005339 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005340 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005341 ASSERT_VK_SUCCESS(err);
5342 // Have to bind memory to image before recording cmd in cmd buffer using it
5343 VkMemoryRequirements mem_reqs;
5344 VkDeviceMemory image_mem;
5345 bool pass;
5346 VkMemoryAllocateInfo mem_alloc = {};
5347 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5348 mem_alloc.pNext = NULL;
5349 mem_alloc.memoryTypeIndex = 0;
5350 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5351 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005352 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005353 ASSERT_TRUE(pass);
5354 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5355 ASSERT_VK_SUCCESS(err);
5356
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005357 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005359 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005360
5361 m_commandBuffer->BeginCommandBuffer();
5362 VkClearColorValue ccv;
5363 ccv.float32[0] = 1.0f;
5364 ccv.float32[1] = 1.0f;
5365 ccv.float32[2] = 1.0f;
5366 ccv.float32[3] = 1.0f;
5367 VkImageSubresourceRange isr = {};
5368 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5369 isr.baseArrayLayer = 0;
5370 isr.baseMipLevel = 0;
5371 isr.layerCount = 1;
5372 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005373 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 m_commandBuffer->EndCommandBuffer();
5375
5376 m_errorMonitor->VerifyFound();
5377 vkDestroyImage(m_device->device(), image, NULL);
5378 vkFreeMemory(m_device->device(), image_mem, nullptr);
5379}
5380
5381TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005382 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005383 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005384
5385 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005386 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 -06005387 VK_IMAGE_TILING_OPTIMAL, 0);
5388 ASSERT_TRUE(image.initialized());
5389
5390 VkBuffer buffer;
5391 VkDeviceMemory mem;
5392 VkMemoryRequirements mem_reqs;
5393
5394 VkBufferCreateInfo buf_info = {};
5395 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005396 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005397 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005398 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5399 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5400 ASSERT_VK_SUCCESS(err);
5401
5402 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5403
5404 VkMemoryAllocateInfo alloc_info = {};
5405 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005406 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005407 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005408 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 -06005409 if (!pass) {
5410 vkDestroyBuffer(m_device->device(), buffer, NULL);
5411 return;
5412 }
5413 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5414 ASSERT_VK_SUCCESS(err);
5415
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005416 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005418 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005419 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005420 region.bufferRowLength = 16;
5421 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005422 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5423
5424 region.imageSubresource.layerCount = 1;
5425 region.imageExtent.height = 4;
5426 region.imageExtent.width = 4;
5427 region.imageExtent.depth = 1;
5428 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005429 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5430 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005431 m_commandBuffer->EndCommandBuffer();
5432
5433 m_errorMonitor->VerifyFound();
5434
5435 vkDestroyBuffer(m_device->device(), buffer, NULL);
5436 vkFreeMemory(m_device->handle(), mem, NULL);
5437}
5438
Tobin Ehlis85940f52016-07-07 16:57:21 -06005439TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005440 TEST_DESCRIPTION(
5441 "Attempt to draw with a command buffer that is invalid "
5442 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005443 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005444
5445 VkEvent event;
5446 VkEventCreateInfo evci = {};
5447 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5448 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5449 ASSERT_VK_SUCCESS(result);
5450
5451 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005452 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005453 m_commandBuffer->EndCommandBuffer();
5454
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005456 // Destroy event dependency prior to submit to cause ERROR
5457 vkDestroyEvent(m_device->device(), event, NULL);
5458
5459 VkSubmitInfo submit_info = {};
5460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5461 submit_info.commandBufferCount = 1;
5462 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5463 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5464
5465 m_errorMonitor->VerifyFound();
5466}
5467
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005468TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005469 TEST_DESCRIPTION(
5470 "Attempt to draw with a command buffer that is invalid "
5471 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005472 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005473
5474 VkQueryPool query_pool;
5475 VkQueryPoolCreateInfo qpci{};
5476 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5477 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5478 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005479 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005480 ASSERT_VK_SUCCESS(result);
5481
5482 m_commandBuffer->BeginCommandBuffer();
5483 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5484 m_commandBuffer->EndCommandBuffer();
5485
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005487 // Destroy query pool dependency prior to submit to cause ERROR
5488 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5489
5490 VkSubmitInfo submit_info = {};
5491 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5492 submit_info.commandBufferCount = 1;
5493 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5494 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5495
5496 m_errorMonitor->VerifyFound();
5497}
5498
Tobin Ehlis24130d92016-07-08 15:50:53 -06005499TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005500 TEST_DESCRIPTION(
5501 "Attempt to draw with a command buffer that is invalid "
5502 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5505
5506 VkResult err;
5507
5508 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5509 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5510
5511 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005512 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005513 ASSERT_VK_SUCCESS(err);
5514
5515 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5516 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5517 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005518 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005519 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005520 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005521 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005522 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005523
5524 VkPipelineShaderStageCreateInfo shaderStages[2];
5525 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5526
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005527 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005528 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 -06005529 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005530 shaderStages[0] = vs.GetStageCreateInfo();
5531 shaderStages[1] = fs.GetStageCreateInfo();
5532
5533 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5534 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5535
5536 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5537 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5538 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5539
5540 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5541 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005542 rs_ci.rasterizerDiscardEnable = true;
5543 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005544
5545 VkPipelineColorBlendAttachmentState att = {};
5546 att.blendEnable = VK_FALSE;
5547 att.colorWriteMask = 0xf;
5548
5549 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5550 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5551 cb_ci.attachmentCount = 1;
5552 cb_ci.pAttachments = &att;
5553
5554 VkGraphicsPipelineCreateInfo gp_ci = {};
5555 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5556 gp_ci.stageCount = 2;
5557 gp_ci.pStages = shaderStages;
5558 gp_ci.pVertexInputState = &vi_ci;
5559 gp_ci.pInputAssemblyState = &ia_ci;
5560 gp_ci.pViewportState = &vp_state_ci;
5561 gp_ci.pRasterizationState = &rs_ci;
5562 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5564 gp_ci.layout = pipeline_layout;
5565 gp_ci.renderPass = renderPass();
5566
5567 VkPipelineCacheCreateInfo pc_ci = {};
5568 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5569
5570 VkPipeline pipeline;
5571 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005572 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005573 ASSERT_VK_SUCCESS(err);
5574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005575 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005576 ASSERT_VK_SUCCESS(err);
5577
5578 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005579 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005580 m_commandBuffer->EndCommandBuffer();
5581 // Now destroy pipeline in order to cause error when submitting
5582 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5583
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005585
5586 VkSubmitInfo submit_info = {};
5587 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5588 submit_info.commandBufferCount = 1;
5589 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5590 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5591
5592 m_errorMonitor->VerifyFound();
5593 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5594 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5595}
5596
Tobin Ehlis31289162016-08-17 14:57:58 -06005597TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005598 TEST_DESCRIPTION(
5599 "Attempt to draw with a command buffer that is invalid "
5600 "due to a bound descriptor set with a buffer dependency "
5601 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005602 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005603 ASSERT_NO_FATAL_FAILURE(InitViewport());
5604 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5605
5606 VkDescriptorPoolSize ds_type_count = {};
5607 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5608 ds_type_count.descriptorCount = 1;
5609
5610 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5611 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5612 ds_pool_ci.pNext = NULL;
5613 ds_pool_ci.maxSets = 1;
5614 ds_pool_ci.poolSizeCount = 1;
5615 ds_pool_ci.pPoolSizes = &ds_type_count;
5616
5617 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005618 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005619 ASSERT_VK_SUCCESS(err);
5620
5621 VkDescriptorSetLayoutBinding dsl_binding = {};
5622 dsl_binding.binding = 0;
5623 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5624 dsl_binding.descriptorCount = 1;
5625 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5626 dsl_binding.pImmutableSamplers = NULL;
5627
5628 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5629 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5630 ds_layout_ci.pNext = NULL;
5631 ds_layout_ci.bindingCount = 1;
5632 ds_layout_ci.pBindings = &dsl_binding;
5633 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005634 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005635 ASSERT_VK_SUCCESS(err);
5636
5637 VkDescriptorSet descriptorSet;
5638 VkDescriptorSetAllocateInfo alloc_info = {};
5639 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5640 alloc_info.descriptorSetCount = 1;
5641 alloc_info.descriptorPool = ds_pool;
5642 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005643 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005644 ASSERT_VK_SUCCESS(err);
5645
5646 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5647 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5648 pipeline_layout_ci.pNext = NULL;
5649 pipeline_layout_ci.setLayoutCount = 1;
5650 pipeline_layout_ci.pSetLayouts = &ds_layout;
5651
5652 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005653 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005654 ASSERT_VK_SUCCESS(err);
5655
5656 // Create a buffer to update the descriptor with
5657 uint32_t qfi = 0;
5658 VkBufferCreateInfo buffCI = {};
5659 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5660 buffCI.size = 1024;
5661 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5662 buffCI.queueFamilyIndexCount = 1;
5663 buffCI.pQueueFamilyIndices = &qfi;
5664
5665 VkBuffer buffer;
5666 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5667 ASSERT_VK_SUCCESS(err);
5668 // Allocate memory and bind to buffer so we can make it to the appropriate
5669 // error
5670 VkMemoryAllocateInfo mem_alloc = {};
5671 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5672 mem_alloc.pNext = NULL;
5673 mem_alloc.allocationSize = 1024;
5674 mem_alloc.memoryTypeIndex = 0;
5675
5676 VkMemoryRequirements memReqs;
5677 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005678 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005679 if (!pass) {
5680 vkDestroyBuffer(m_device->device(), buffer, NULL);
5681 return;
5682 }
5683
5684 VkDeviceMemory mem;
5685 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5686 ASSERT_VK_SUCCESS(err);
5687 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5688 ASSERT_VK_SUCCESS(err);
5689 // Correctly update descriptor to avoid "NOT_UPDATED" error
5690 VkDescriptorBufferInfo buffInfo = {};
5691 buffInfo.buffer = buffer;
5692 buffInfo.offset = 0;
5693 buffInfo.range = 1024;
5694
5695 VkWriteDescriptorSet descriptor_write;
5696 memset(&descriptor_write, 0, sizeof(descriptor_write));
5697 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5698 descriptor_write.dstSet = descriptorSet;
5699 descriptor_write.dstBinding = 0;
5700 descriptor_write.descriptorCount = 1;
5701 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5702 descriptor_write.pBufferInfo = &buffInfo;
5703
5704 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5705
5706 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005707 char const *vsSource =
5708 "#version 450\n"
5709 "\n"
5710 "out gl_PerVertex { \n"
5711 " vec4 gl_Position;\n"
5712 "};\n"
5713 "void main(){\n"
5714 " gl_Position = vec4(1);\n"
5715 "}\n";
5716 char const *fsSource =
5717 "#version 450\n"
5718 "\n"
5719 "layout(location=0) out vec4 x;\n"
5720 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5721 "void main(){\n"
5722 " x = vec4(bar.y);\n"
5723 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005724 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5725 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5726 VkPipelineObj pipe(m_device);
5727 pipe.AddShader(&vs);
5728 pipe.AddShader(&fs);
5729 pipe.AddColorAttachment();
5730 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5731
Tony Barbour552f6c02016-12-21 14:34:07 -07005732 m_commandBuffer->BeginCommandBuffer();
5733 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005734 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5735 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5736 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005737
5738 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5739 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5740
Tobin Ehlis31289162016-08-17 14:57:58 -06005741 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005742 m_commandBuffer->EndRenderPass();
5743 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005745 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5746 vkDestroyBuffer(m_device->device(), buffer, NULL);
5747 // Attempt to submit cmd buffer
5748 VkSubmitInfo submit_info = {};
5749 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5750 submit_info.commandBufferCount = 1;
5751 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5752 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5753 m_errorMonitor->VerifyFound();
5754 // Cleanup
5755 vkFreeMemory(m_device->device(), mem, NULL);
5756
5757 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5758 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5759 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5760}
5761
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005762TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005763 TEST_DESCRIPTION(
5764 "Attempt to draw with a command buffer that is invalid "
5765 "due to a bound descriptor sets with a combined image "
5766 "sampler having their image, sampler, and descriptor set "
5767 "each respectively destroyed and then attempting to "
5768 "submit associated cmd buffers. Attempt to destroy a "
5769 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005770 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005771 ASSERT_NO_FATAL_FAILURE(InitViewport());
5772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5773
5774 VkDescriptorPoolSize ds_type_count = {};
5775 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5776 ds_type_count.descriptorCount = 1;
5777
5778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5780 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005781 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005782 ds_pool_ci.maxSets = 1;
5783 ds_pool_ci.poolSizeCount = 1;
5784 ds_pool_ci.pPoolSizes = &ds_type_count;
5785
5786 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005787 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005788 ASSERT_VK_SUCCESS(err);
5789
5790 VkDescriptorSetLayoutBinding dsl_binding = {};
5791 dsl_binding.binding = 0;
5792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5793 dsl_binding.descriptorCount = 1;
5794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5795 dsl_binding.pImmutableSamplers = NULL;
5796
5797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5799 ds_layout_ci.pNext = NULL;
5800 ds_layout_ci.bindingCount = 1;
5801 ds_layout_ci.pBindings = &dsl_binding;
5802 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005804 ASSERT_VK_SUCCESS(err);
5805
5806 VkDescriptorSet descriptorSet;
5807 VkDescriptorSetAllocateInfo alloc_info = {};
5808 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5809 alloc_info.descriptorSetCount = 1;
5810 alloc_info.descriptorPool = ds_pool;
5811 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005812 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005813 ASSERT_VK_SUCCESS(err);
5814
5815 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5816 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5817 pipeline_layout_ci.pNext = NULL;
5818 pipeline_layout_ci.setLayoutCount = 1;
5819 pipeline_layout_ci.pSetLayouts = &ds_layout;
5820
5821 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005822 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005823 ASSERT_VK_SUCCESS(err);
5824
5825 // Create images to update the descriptor with
5826 VkImage image;
5827 VkImage image2;
5828 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5829 const int32_t tex_width = 32;
5830 const int32_t tex_height = 32;
5831 VkImageCreateInfo image_create_info = {};
5832 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5833 image_create_info.pNext = NULL;
5834 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5835 image_create_info.format = tex_format;
5836 image_create_info.extent.width = tex_width;
5837 image_create_info.extent.height = tex_height;
5838 image_create_info.extent.depth = 1;
5839 image_create_info.mipLevels = 1;
5840 image_create_info.arrayLayers = 1;
5841 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5842 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5843 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5844 image_create_info.flags = 0;
5845 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5846 ASSERT_VK_SUCCESS(err);
5847 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5848 ASSERT_VK_SUCCESS(err);
5849
5850 VkMemoryRequirements memory_reqs;
5851 VkDeviceMemory image_memory;
5852 bool pass;
5853 VkMemoryAllocateInfo memory_info = {};
5854 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5855 memory_info.pNext = NULL;
5856 memory_info.allocationSize = 0;
5857 memory_info.memoryTypeIndex = 0;
5858 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5859 // Allocate enough memory for both images
5860 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005861 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005862 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005863 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005864 ASSERT_VK_SUCCESS(err);
5865 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5866 ASSERT_VK_SUCCESS(err);
5867 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005868 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005869 ASSERT_VK_SUCCESS(err);
5870
5871 VkImageViewCreateInfo image_view_create_info = {};
5872 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5873 image_view_create_info.image = image;
5874 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5875 image_view_create_info.format = tex_format;
5876 image_view_create_info.subresourceRange.layerCount = 1;
5877 image_view_create_info.subresourceRange.baseMipLevel = 0;
5878 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005879 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005880
5881 VkImageView view;
5882 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005883 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005884 ASSERT_VK_SUCCESS(err);
5885 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005886 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005887 ASSERT_VK_SUCCESS(err);
5888 // Create Samplers
5889 VkSamplerCreateInfo sampler_ci = {};
5890 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5891 sampler_ci.pNext = NULL;
5892 sampler_ci.magFilter = VK_FILTER_NEAREST;
5893 sampler_ci.minFilter = VK_FILTER_NEAREST;
5894 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5895 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5896 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5897 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5898 sampler_ci.mipLodBias = 1.0;
5899 sampler_ci.anisotropyEnable = VK_FALSE;
5900 sampler_ci.maxAnisotropy = 1;
5901 sampler_ci.compareEnable = VK_FALSE;
5902 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5903 sampler_ci.minLod = 1.0;
5904 sampler_ci.maxLod = 1.0;
5905 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5906 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5907 VkSampler sampler;
5908 VkSampler sampler2;
5909 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5910 ASSERT_VK_SUCCESS(err);
5911 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5912 ASSERT_VK_SUCCESS(err);
5913 // Update descriptor with image and sampler
5914 VkDescriptorImageInfo img_info = {};
5915 img_info.sampler = sampler;
5916 img_info.imageView = view;
5917 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5918
5919 VkWriteDescriptorSet descriptor_write;
5920 memset(&descriptor_write, 0, sizeof(descriptor_write));
5921 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5922 descriptor_write.dstSet = descriptorSet;
5923 descriptor_write.dstBinding = 0;
5924 descriptor_write.descriptorCount = 1;
5925 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5926 descriptor_write.pImageInfo = &img_info;
5927
5928 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5929
5930 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005931 char const *vsSource =
5932 "#version 450\n"
5933 "\n"
5934 "out gl_PerVertex { \n"
5935 " vec4 gl_Position;\n"
5936 "};\n"
5937 "void main(){\n"
5938 " gl_Position = vec4(1);\n"
5939 "}\n";
5940 char const *fsSource =
5941 "#version 450\n"
5942 "\n"
5943 "layout(set=0, binding=0) uniform sampler2D s;\n"
5944 "layout(location=0) out vec4 x;\n"
5945 "void main(){\n"
5946 " x = texture(s, vec2(1));\n"
5947 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5950 VkPipelineObj pipe(m_device);
5951 pipe.AddShader(&vs);
5952 pipe.AddShader(&fs);
5953 pipe.AddColorAttachment();
5954 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5955
5956 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005958 m_commandBuffer->BeginCommandBuffer();
5959 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005960 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5961 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5962 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005963 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5964 VkRect2D scissor = {{0, 0}, {16, 16}};
5965 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5966 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005968 m_commandBuffer->EndRenderPass();
5969 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005970 // Destroy sampler invalidates the cmd buffer, causing error on submit
5971 vkDestroySampler(m_device->device(), sampler, NULL);
5972 // Attempt to submit cmd buffer
5973 VkSubmitInfo submit_info = {};
5974 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5975 submit_info.commandBufferCount = 1;
5976 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5977 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5978 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005979
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005980 // Now re-update descriptor with valid sampler and delete image
5981 img_info.sampler = sampler2;
5982 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005983
5984 VkCommandBufferBeginInfo info = {};
5985 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5986 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5987
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005989 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005990 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005991 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5992 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5993 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5995 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005996 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005997 m_commandBuffer->EndRenderPass();
5998 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 // Destroy image invalidates the cmd buffer, causing error on submit
6000 vkDestroyImage(m_device->device(), image, NULL);
6001 // Attempt to submit cmd buffer
6002 submit_info = {};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6007 m_errorMonitor->VerifyFound();
6008 // Now update descriptor to be valid, but then free descriptor
6009 img_info.imageView = view2;
6010 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006011 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006012 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006013 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6014 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6015 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006016 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6017 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006018 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006019 m_commandBuffer->EndRenderPass();
6020 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006021 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006022
6023 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006026 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006027
6028 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006029 // 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 -07006030 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006031 m_errorMonitor->SetUnexpectedError(
6032 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6033 "either be a valid handle or VK_NULL_HANDLE");
6034 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006035 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6036
6037 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006038 submit_info = {};
6039 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6040 submit_info.commandBufferCount = 1;
6041 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006043 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6044 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006045
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006046 // Cleanup
6047 vkFreeMemory(m_device->device(), image_memory, NULL);
6048 vkDestroySampler(m_device->device(), sampler2, NULL);
6049 vkDestroyImage(m_device->device(), image2, NULL);
6050 vkDestroyImageView(m_device->device(), view, NULL);
6051 vkDestroyImageView(m_device->device(), view2, NULL);
6052 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6053 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6054 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6055}
6056
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006057TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6058 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006059 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006060 ASSERT_NO_FATAL_FAILURE(InitViewport());
6061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6062
6063 VkDescriptorPoolSize ds_type_count = {};
6064 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6065 ds_type_count.descriptorCount = 1;
6066
6067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6069 ds_pool_ci.pNext = NULL;
6070 ds_pool_ci.maxSets = 1;
6071 ds_pool_ci.poolSizeCount = 1;
6072 ds_pool_ci.pPoolSizes = &ds_type_count;
6073
6074 VkDescriptorPool ds_pool;
6075 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6076 ASSERT_VK_SUCCESS(err);
6077
6078 VkDescriptorSetLayoutBinding dsl_binding = {};
6079 dsl_binding.binding = 0;
6080 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6081 dsl_binding.descriptorCount = 1;
6082 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6083 dsl_binding.pImmutableSamplers = NULL;
6084
6085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6087 ds_layout_ci.pNext = NULL;
6088 ds_layout_ci.bindingCount = 1;
6089 ds_layout_ci.pBindings = &dsl_binding;
6090 VkDescriptorSetLayout ds_layout;
6091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6092 ASSERT_VK_SUCCESS(err);
6093
6094 VkDescriptorSet descriptor_set;
6095 VkDescriptorSetAllocateInfo alloc_info = {};
6096 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6097 alloc_info.descriptorSetCount = 1;
6098 alloc_info.descriptorPool = ds_pool;
6099 alloc_info.pSetLayouts = &ds_layout;
6100 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6101 ASSERT_VK_SUCCESS(err);
6102
6103 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6104 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6105 pipeline_layout_ci.pNext = NULL;
6106 pipeline_layout_ci.setLayoutCount = 1;
6107 pipeline_layout_ci.pSetLayouts = &ds_layout;
6108
6109 VkPipelineLayout pipeline_layout;
6110 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6111 ASSERT_VK_SUCCESS(err);
6112
6113 // Create image to update the descriptor with
6114 VkImageObj image(m_device);
6115 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6116 ASSERT_TRUE(image.initialized());
6117
6118 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6119 // Create Sampler
6120 VkSamplerCreateInfo sampler_ci = {};
6121 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6122 sampler_ci.pNext = NULL;
6123 sampler_ci.magFilter = VK_FILTER_NEAREST;
6124 sampler_ci.minFilter = VK_FILTER_NEAREST;
6125 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6126 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6127 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6128 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.mipLodBias = 1.0;
6130 sampler_ci.anisotropyEnable = VK_FALSE;
6131 sampler_ci.maxAnisotropy = 1;
6132 sampler_ci.compareEnable = VK_FALSE;
6133 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6134 sampler_ci.minLod = 1.0;
6135 sampler_ci.maxLod = 1.0;
6136 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6137 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6138 VkSampler sampler;
6139 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6140 ASSERT_VK_SUCCESS(err);
6141 // Update descriptor with image and sampler
6142 VkDescriptorImageInfo img_info = {};
6143 img_info.sampler = sampler;
6144 img_info.imageView = view;
6145 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6146
6147 VkWriteDescriptorSet descriptor_write;
6148 memset(&descriptor_write, 0, sizeof(descriptor_write));
6149 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6150 descriptor_write.dstSet = descriptor_set;
6151 descriptor_write.dstBinding = 0;
6152 descriptor_write.descriptorCount = 1;
6153 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6154 descriptor_write.pImageInfo = &img_info;
6155
6156 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6157
6158 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006159 char const *vsSource =
6160 "#version 450\n"
6161 "\n"
6162 "out gl_PerVertex { \n"
6163 " vec4 gl_Position;\n"
6164 "};\n"
6165 "void main(){\n"
6166 " gl_Position = vec4(1);\n"
6167 "}\n";
6168 char const *fsSource =
6169 "#version 450\n"
6170 "\n"
6171 "layout(set=0, binding=0) uniform sampler2D s;\n"
6172 "layout(location=0) out vec4 x;\n"
6173 "void main(){\n"
6174 " x = texture(s, vec2(1));\n"
6175 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006176 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6177 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6178 VkPipelineObj pipe(m_device);
6179 pipe.AddShader(&vs);
6180 pipe.AddShader(&fs);
6181 pipe.AddColorAttachment();
6182 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6183
Tony Barbour552f6c02016-12-21 14:34:07 -07006184 m_commandBuffer->BeginCommandBuffer();
6185 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006186 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6187 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6188 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006189
6190 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6191 VkRect2D scissor = {{0, 0}, {16, 16}};
6192 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6193 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6194
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006195 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006196 m_commandBuffer->EndRenderPass();
6197 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006198 // Submit cmd buffer to put pool in-flight
6199 VkSubmitInfo submit_info = {};
6200 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6201 submit_info.commandBufferCount = 1;
6202 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6203 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6204 // Destroy pool while in-flight, causing error
6205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6206 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6207 m_errorMonitor->VerifyFound();
6208 vkQueueWaitIdle(m_device->m_queue);
6209 // Cleanup
6210 vkDestroySampler(m_device->device(), sampler, NULL);
6211 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6212 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006213 m_errorMonitor->SetUnexpectedError(
6214 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6215 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006216 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006217 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006218}
6219
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006220TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6221 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006223 ASSERT_NO_FATAL_FAILURE(InitViewport());
6224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6225
6226 VkDescriptorPoolSize ds_type_count = {};
6227 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6228 ds_type_count.descriptorCount = 1;
6229
6230 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6231 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6232 ds_pool_ci.pNext = NULL;
6233 ds_pool_ci.maxSets = 1;
6234 ds_pool_ci.poolSizeCount = 1;
6235 ds_pool_ci.pPoolSizes = &ds_type_count;
6236
6237 VkDescriptorPool ds_pool;
6238 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6239 ASSERT_VK_SUCCESS(err);
6240
6241 VkDescriptorSetLayoutBinding dsl_binding = {};
6242 dsl_binding.binding = 0;
6243 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6244 dsl_binding.descriptorCount = 1;
6245 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6246 dsl_binding.pImmutableSamplers = NULL;
6247
6248 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6249 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6250 ds_layout_ci.pNext = NULL;
6251 ds_layout_ci.bindingCount = 1;
6252 ds_layout_ci.pBindings = &dsl_binding;
6253 VkDescriptorSetLayout ds_layout;
6254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6255 ASSERT_VK_SUCCESS(err);
6256
6257 VkDescriptorSet descriptorSet;
6258 VkDescriptorSetAllocateInfo alloc_info = {};
6259 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6260 alloc_info.descriptorSetCount = 1;
6261 alloc_info.descriptorPool = ds_pool;
6262 alloc_info.pSetLayouts = &ds_layout;
6263 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6264 ASSERT_VK_SUCCESS(err);
6265
6266 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6267 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6268 pipeline_layout_ci.pNext = NULL;
6269 pipeline_layout_ci.setLayoutCount = 1;
6270 pipeline_layout_ci.pSetLayouts = &ds_layout;
6271
6272 VkPipelineLayout pipeline_layout;
6273 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6274 ASSERT_VK_SUCCESS(err);
6275
6276 // Create images to update the descriptor with
6277 VkImage image;
6278 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6279 const int32_t tex_width = 32;
6280 const int32_t tex_height = 32;
6281 VkImageCreateInfo image_create_info = {};
6282 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6283 image_create_info.pNext = NULL;
6284 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6285 image_create_info.format = tex_format;
6286 image_create_info.extent.width = tex_width;
6287 image_create_info.extent.height = tex_height;
6288 image_create_info.extent.depth = 1;
6289 image_create_info.mipLevels = 1;
6290 image_create_info.arrayLayers = 1;
6291 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6292 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6293 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6294 image_create_info.flags = 0;
6295 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6296 ASSERT_VK_SUCCESS(err);
6297 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6298 VkMemoryRequirements memory_reqs;
6299 VkDeviceMemory image_memory;
6300 bool pass;
6301 VkMemoryAllocateInfo memory_info = {};
6302 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6303 memory_info.pNext = NULL;
6304 memory_info.allocationSize = 0;
6305 memory_info.memoryTypeIndex = 0;
6306 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6307 // Allocate enough memory for image
6308 memory_info.allocationSize = memory_reqs.size;
6309 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6310 ASSERT_TRUE(pass);
6311 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6312 ASSERT_VK_SUCCESS(err);
6313 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6314 ASSERT_VK_SUCCESS(err);
6315
6316 VkImageViewCreateInfo image_view_create_info = {};
6317 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6318 image_view_create_info.image = image;
6319 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6320 image_view_create_info.format = tex_format;
6321 image_view_create_info.subresourceRange.layerCount = 1;
6322 image_view_create_info.subresourceRange.baseMipLevel = 0;
6323 image_view_create_info.subresourceRange.levelCount = 1;
6324 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6325
6326 VkImageView view;
6327 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6328 ASSERT_VK_SUCCESS(err);
6329 // Create Samplers
6330 VkSamplerCreateInfo sampler_ci = {};
6331 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6332 sampler_ci.pNext = NULL;
6333 sampler_ci.magFilter = VK_FILTER_NEAREST;
6334 sampler_ci.minFilter = VK_FILTER_NEAREST;
6335 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6336 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6337 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6338 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6339 sampler_ci.mipLodBias = 1.0;
6340 sampler_ci.anisotropyEnable = VK_FALSE;
6341 sampler_ci.maxAnisotropy = 1;
6342 sampler_ci.compareEnable = VK_FALSE;
6343 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6344 sampler_ci.minLod = 1.0;
6345 sampler_ci.maxLod = 1.0;
6346 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6347 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6348 VkSampler sampler;
6349 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6350 ASSERT_VK_SUCCESS(err);
6351 // Update descriptor with image and sampler
6352 VkDescriptorImageInfo img_info = {};
6353 img_info.sampler = sampler;
6354 img_info.imageView = view;
6355 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6356
6357 VkWriteDescriptorSet descriptor_write;
6358 memset(&descriptor_write, 0, sizeof(descriptor_write));
6359 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6360 descriptor_write.dstSet = descriptorSet;
6361 descriptor_write.dstBinding = 0;
6362 descriptor_write.descriptorCount = 1;
6363 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6364 descriptor_write.pImageInfo = &img_info;
6365 // Break memory binding and attempt update
6366 vkFreeMemory(m_device->device(), image_memory, nullptr);
6367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006368 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6370 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6371 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6372 m_errorMonitor->VerifyFound();
6373 // Cleanup
6374 vkDestroyImage(m_device->device(), image, NULL);
6375 vkDestroySampler(m_device->device(), sampler, NULL);
6376 vkDestroyImageView(m_device->device(), view, NULL);
6377 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6378 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6379 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6380}
6381
Karl Schultz6addd812016-02-02 17:17:23 -07006382TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006383 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6384 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006385 // Create a valid cmd buffer
6386 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006387 uint64_t fake_pipeline_handle = 0xbaad6001;
6388 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6391
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006393 m_commandBuffer->BeginCommandBuffer();
6394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006395 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006396 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006397
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006398 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006399 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 -06006400 Draw(1, 0, 0, 0);
6401 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006402
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006403 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006404 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 -07006405 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006406 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6407 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006408}
6409
Karl Schultz6addd812016-02-02 17:17:23 -07006410TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006411 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006412 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006415
Tony Barbour1fa09702017-03-16 12:09:08 -06006416 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006417 ASSERT_NO_FATAL_FAILURE(InitViewport());
6418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006419 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006420 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6421 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006422
6423 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006424 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6425 ds_pool_ci.pNext = NULL;
6426 ds_pool_ci.maxSets = 1;
6427 ds_pool_ci.poolSizeCount = 1;
6428 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006429
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006430 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006431 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006432 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006433
Tony Barboureb254902015-07-15 12:50:33 -06006434 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006435 dsl_binding.binding = 0;
6436 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6437 dsl_binding.descriptorCount = 1;
6438 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6439 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006440
Tony Barboureb254902015-07-15 12:50:33 -06006441 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006442 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6443 ds_layout_ci.pNext = NULL;
6444 ds_layout_ci.bindingCount = 1;
6445 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006446 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006447 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006448 ASSERT_VK_SUCCESS(err);
6449
6450 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006451 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006453 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006454 alloc_info.descriptorPool = ds_pool;
6455 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006457 ASSERT_VK_SUCCESS(err);
6458
Tony Barboureb254902015-07-15 12:50:33 -06006459 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006460 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6461 pipeline_layout_ci.pNext = NULL;
6462 pipeline_layout_ci.setLayoutCount = 1;
6463 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006464
6465 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006466 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006467 ASSERT_VK_SUCCESS(err);
6468
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006469 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006470 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006471 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006472 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006473
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006474 VkPipelineObj pipe(m_device);
6475 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006476 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006477 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006478 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006479
Tony Barbour552f6c02016-12-21 14:34:07 -07006480 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006481 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6482 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6483 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006484
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006485 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006486
Chia-I Wuf7458c52015-10-26 21:10:41 +08006487 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6488 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006490}
6491
Karl Schultz6addd812016-02-02 17:17:23 -07006492TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006493 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006494 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006495
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006497
Tony Barbour1fa09702017-03-16 12:09:08 -06006498 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006499 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006500 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6501 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006502
6503 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006504 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6505 ds_pool_ci.pNext = NULL;
6506 ds_pool_ci.maxSets = 1;
6507 ds_pool_ci.poolSizeCount = 1;
6508 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006509
6510 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006511 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512 ASSERT_VK_SUCCESS(err);
6513
6514 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006515 dsl_binding.binding = 0;
6516 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6517 dsl_binding.descriptorCount = 1;
6518 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6519 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006520
6521 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006522 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6523 ds_layout_ci.pNext = NULL;
6524 ds_layout_ci.bindingCount = 1;
6525 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006526 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006527 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006528 ASSERT_VK_SUCCESS(err);
6529
6530 VkDescriptorSet descriptorSet;
6531 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006532 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006533 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006534 alloc_info.descriptorPool = ds_pool;
6535 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006536 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006537 ASSERT_VK_SUCCESS(err);
6538
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006539 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006540 VkWriteDescriptorSet descriptor_write;
6541 memset(&descriptor_write, 0, sizeof(descriptor_write));
6542 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6543 descriptor_write.dstSet = descriptorSet;
6544 descriptor_write.dstBinding = 0;
6545 descriptor_write.descriptorCount = 1;
6546 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6547 descriptor_write.pTexelBufferView = &view;
6548
6549 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6550
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006551 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006552
6553 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6554 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6555}
6556
Mark Youngd339ba32016-05-30 13:28:35 -06006557TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006558 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 -06006559
6560 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006562 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006563
Tony Barbour1fa09702017-03-16 12:09:08 -06006564 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006565
6566 // Create a buffer with no bound memory and then attempt to create
6567 // a buffer view.
6568 VkBufferCreateInfo buff_ci = {};
6569 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006570 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006571 buff_ci.size = 256;
6572 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6573 VkBuffer buffer;
6574 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6575 ASSERT_VK_SUCCESS(err);
6576
6577 VkBufferViewCreateInfo buff_view_ci = {};
6578 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6579 buff_view_ci.buffer = buffer;
6580 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6581 buff_view_ci.range = VK_WHOLE_SIZE;
6582 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006583 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006584
6585 m_errorMonitor->VerifyFound();
6586 vkDestroyBuffer(m_device->device(), buffer, NULL);
6587 // If last error is success, it still created the view, so delete it.
6588 if (err == VK_SUCCESS) {
6589 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6590 }
6591}
6592
Karl Schultz6addd812016-02-02 17:17:23 -07006593TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6594 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6595 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006596 // 1. No dynamicOffset supplied
6597 // 2. Too many dynamicOffsets supplied
6598 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006599 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6601 " requires 1 dynamicOffsets, but only "
6602 "0 dynamicOffsets are left in "
6603 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006604
Tony Barbour1fa09702017-03-16 12:09:08 -06006605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006606 ASSERT_NO_FATAL_FAILURE(InitViewport());
6607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6608
6609 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006610 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6611 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006612
6613 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006614 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6615 ds_pool_ci.pNext = NULL;
6616 ds_pool_ci.maxSets = 1;
6617 ds_pool_ci.poolSizeCount = 1;
6618 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006619
6620 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006621 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006622 ASSERT_VK_SUCCESS(err);
6623
6624 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006625 dsl_binding.binding = 0;
6626 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6627 dsl_binding.descriptorCount = 1;
6628 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6629 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006630
6631 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006632 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6633 ds_layout_ci.pNext = NULL;
6634 ds_layout_ci.bindingCount = 1;
6635 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006636 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006638 ASSERT_VK_SUCCESS(err);
6639
6640 VkDescriptorSet descriptorSet;
6641 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006643 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006644 alloc_info.descriptorPool = ds_pool;
6645 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006646 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006647 ASSERT_VK_SUCCESS(err);
6648
6649 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006650 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6651 pipeline_layout_ci.pNext = NULL;
6652 pipeline_layout_ci.setLayoutCount = 1;
6653 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006654
6655 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006656 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006657 ASSERT_VK_SUCCESS(err);
6658
6659 // Create a buffer to update the descriptor with
6660 uint32_t qfi = 0;
6661 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006662 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6663 buffCI.size = 1024;
6664 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6665 buffCI.queueFamilyIndexCount = 1;
6666 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006667
6668 VkBuffer dyub;
6669 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6670 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006671 // Allocate memory and bind to buffer so we can make it to the appropriate
6672 // error
6673 VkMemoryAllocateInfo mem_alloc = {};
6674 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6675 mem_alloc.pNext = NULL;
6676 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006677 mem_alloc.memoryTypeIndex = 0;
6678
6679 VkMemoryRequirements memReqs;
6680 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006681 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006682 if (!pass) {
6683 vkDestroyBuffer(m_device->device(), dyub, NULL);
6684 return;
6685 }
6686
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006687 VkDeviceMemory mem;
6688 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6689 ASSERT_VK_SUCCESS(err);
6690 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6691 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006692 // Correctly update descriptor to avoid "NOT_UPDATED" error
6693 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006694 buffInfo.buffer = dyub;
6695 buffInfo.offset = 0;
6696 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006697
6698 VkWriteDescriptorSet descriptor_write;
6699 memset(&descriptor_write, 0, sizeof(descriptor_write));
6700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6701 descriptor_write.dstSet = descriptorSet;
6702 descriptor_write.dstBinding = 0;
6703 descriptor_write.descriptorCount = 1;
6704 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6705 descriptor_write.pBufferInfo = &buffInfo;
6706
6707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6708
Tony Barbour552f6c02016-12-21 14:34:07 -07006709 m_commandBuffer->BeginCommandBuffer();
6710 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006711 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6712 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006713 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006714 uint32_t pDynOff[2] = {512, 756};
6715 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6717 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6718 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6719 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006720 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006721 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6723 " dynamic offset 512 combined with "
6724 "offset 0 and range 1024 that "
6725 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006726 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006727 char const *vsSource =
6728 "#version 450\n"
6729 "\n"
6730 "out gl_PerVertex { \n"
6731 " vec4 gl_Position;\n"
6732 "};\n"
6733 "void main(){\n"
6734 " gl_Position = vec4(1);\n"
6735 "}\n";
6736 char const *fsSource =
6737 "#version 450\n"
6738 "\n"
6739 "layout(location=0) out vec4 x;\n"
6740 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6741 "void main(){\n"
6742 " x = vec4(bar.y);\n"
6743 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006744 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6745 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6746 VkPipelineObj pipe(m_device);
6747 pipe.AddShader(&vs);
6748 pipe.AddShader(&fs);
6749 pipe.AddColorAttachment();
6750 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6751
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006752 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6753 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6754 VkRect2D scissor = {{0, 0}, {16, 16}};
6755 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6756
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006757 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006758 // This update should succeed, but offset size of 512 will overstep buffer
6759 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006760 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6761 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006762 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006763 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006764
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006765 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006766 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006767
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006768 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006769 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006770 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6771}
6772
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006773TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006774 TEST_DESCRIPTION(
6775 "Attempt to update a descriptor with a non-sparse buffer "
6776 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006777 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006779 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6781 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006782
Tony Barbour1fa09702017-03-16 12:09:08 -06006783 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006784 ASSERT_NO_FATAL_FAILURE(InitViewport());
6785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6786
6787 VkDescriptorPoolSize ds_type_count = {};
6788 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6789 ds_type_count.descriptorCount = 1;
6790
6791 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6792 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6793 ds_pool_ci.pNext = NULL;
6794 ds_pool_ci.maxSets = 1;
6795 ds_pool_ci.poolSizeCount = 1;
6796 ds_pool_ci.pPoolSizes = &ds_type_count;
6797
6798 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006799 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006800 ASSERT_VK_SUCCESS(err);
6801
6802 VkDescriptorSetLayoutBinding dsl_binding = {};
6803 dsl_binding.binding = 0;
6804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6805 dsl_binding.descriptorCount = 1;
6806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6807 dsl_binding.pImmutableSamplers = NULL;
6808
6809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6811 ds_layout_ci.pNext = NULL;
6812 ds_layout_ci.bindingCount = 1;
6813 ds_layout_ci.pBindings = &dsl_binding;
6814 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006815 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006816 ASSERT_VK_SUCCESS(err);
6817
6818 VkDescriptorSet descriptorSet;
6819 VkDescriptorSetAllocateInfo alloc_info = {};
6820 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6821 alloc_info.descriptorSetCount = 1;
6822 alloc_info.descriptorPool = ds_pool;
6823 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006824 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006825 ASSERT_VK_SUCCESS(err);
6826
6827 // Create a buffer to update the descriptor with
6828 uint32_t qfi = 0;
6829 VkBufferCreateInfo buffCI = {};
6830 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6831 buffCI.size = 1024;
6832 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6833 buffCI.queueFamilyIndexCount = 1;
6834 buffCI.pQueueFamilyIndices = &qfi;
6835
6836 VkBuffer dyub;
6837 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6838 ASSERT_VK_SUCCESS(err);
6839
6840 // Attempt to update descriptor without binding memory to it
6841 VkDescriptorBufferInfo buffInfo = {};
6842 buffInfo.buffer = dyub;
6843 buffInfo.offset = 0;
6844 buffInfo.range = 1024;
6845
6846 VkWriteDescriptorSet descriptor_write;
6847 memset(&descriptor_write, 0, sizeof(descriptor_write));
6848 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6849 descriptor_write.dstSet = descriptorSet;
6850 descriptor_write.dstBinding = 0;
6851 descriptor_write.descriptorCount = 1;
6852 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6853 descriptor_write.pBufferInfo = &buffInfo;
6854
6855 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6856 m_errorMonitor->VerifyFound();
6857
6858 vkDestroyBuffer(m_device->device(), dyub, NULL);
6859 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6860 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6861}
6862
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006863TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006864 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006866 ASSERT_NO_FATAL_FAILURE(InitViewport());
6867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6868
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006869 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006870 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006871 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6872 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6873 pipeline_layout_ci.pushConstantRangeCount = 1;
6874 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6875
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006876 //
6877 // Check for invalid push constant ranges in pipeline layouts.
6878 //
6879 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006880 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006881 char const *msg;
6882 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006883
Karl Schultzc81037d2016-05-12 08:11:23 -06006884 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6885 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6886 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6887 "vkCreatePipelineLayout() call has push constants index 0 with "
6888 "size 0."},
6889 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6890 "vkCreatePipelineLayout() call has push constants index 0 with "
6891 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006892 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006893 "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, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006896 "vkCreatePipelineLayout() call has push constants index 0 with "
6897 "size 0."},
6898 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6899 "vkCreatePipelineLayout() call has push constants index 0 with "
6900 "offset 1. Offset must"},
6901 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6902 "vkCreatePipelineLayout() call has push constants index 0 "
6903 "with offset "},
6904 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6905 "vkCreatePipelineLayout() call has push constants "
6906 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006907 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006908 "vkCreatePipelineLayout() call has push constants index 0 "
6909 "with offset "},
6910 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6911 "vkCreatePipelineLayout() call has push "
6912 "constants index 0 with offset "},
6913 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6914 "vkCreatePipelineLayout() call has push "
6915 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006916 }};
6917
6918 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006919 for (const auto &iter : range_tests) {
6920 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006923 m_errorMonitor->VerifyFound();
6924 if (VK_SUCCESS == err) {
6925 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6926 }
6927 }
6928
6929 // Check for invalid stage flag
6930 pc_range.offset = 0;
6931 pc_range.size = 16;
6932 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006933 m_errorMonitor->SetDesiredFailureMsg(
6934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6935 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006936 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006937 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006938 if (VK_SUCCESS == err) {
6939 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6940 }
6941
Karl Schultzc59b72d2017-02-24 15:45:05 -07006942 // Check for duplicate stage flags in a list of push constant ranges.
6943 // A shader can only have one push constant block and that block is mapped
6944 // to the push constant range that has that shader's stage flag set.
6945 // The shader's stage flag can only appear once in all the ranges, so the
6946 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006947 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006948 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006949 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006950 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006951 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006952 // Overlapping ranges are OK, but a stage flag can appear only once.
6953 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6954 {
6955 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6956 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6957 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6958 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006959 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006960 {
6961 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6962 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6963 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6964 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6967 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6968 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6969 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6970 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6971 }},
6972 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6973 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6974 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6975 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6976 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6977 {
6978 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6979 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6980 }},
6981 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6982 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6983 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6984 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6985 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6986 {
6987 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6988 }},
6989 },
6990 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006991
Karl Schultzc59b72d2017-02-24 15:45:05 -07006992 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006993 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006994 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006997 m_errorMonitor->VerifyFound();
6998 if (VK_SUCCESS == err) {
6999 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7000 }
7001 }
7002
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007003 //
7004 // CmdPushConstants tests
7005 //
7006
Karl Schultzc59b72d2017-02-24 15:45:05 -07007007 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007008 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007010 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007011 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007012 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007013 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007014 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007015
7016 const uint8_t dummy_values[100] = {};
7017
7018 m_commandBuffer->BeginCommandBuffer();
7019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007020
7021 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007022 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007024 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007025 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007026
Karl Schultzc59b72d2017-02-24 15:45:05 -07007027 m_errorMonitor->ExpectSuccess();
7028 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7029 m_errorMonitor->VerifyNotFound();
7030 m_errorMonitor->ExpectSuccess();
7031 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7032 m_errorMonitor->VerifyNotFound();
7033 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7034 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7035 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7036 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7037 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7038 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7039 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007040 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007041 for (const auto &iter : cmd_range_tests) {
7042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7043 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7044 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007045 m_errorMonitor->VerifyFound();
7046 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007047
Tony Barbour552f6c02016-12-21 14:34:07 -07007048 m_commandBuffer->EndRenderPass();
7049 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007050 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007051}
7052
Karl Schultz6addd812016-02-02 17:17:23 -07007053TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007054 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007055 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007056
Tony Barbour1fa09702017-03-16 12:09:08 -06007057 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007058 ASSERT_NO_FATAL_FAILURE(InitViewport());
7059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7060
7061 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7062 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007063 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7064 ds_type_count[0].descriptorCount = 10;
7065 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7066 ds_type_count[1].descriptorCount = 2;
7067 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7068 ds_type_count[2].descriptorCount = 2;
7069 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7070 ds_type_count[3].descriptorCount = 5;
7071 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7072 // type
7073 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7074 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7075 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007076
7077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7079 ds_pool_ci.pNext = NULL;
7080 ds_pool_ci.maxSets = 5;
7081 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7082 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007083
7084 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007085 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007086 ASSERT_VK_SUCCESS(err);
7087
7088 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7089 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007090 dsl_binding[0].binding = 0;
7091 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7092 dsl_binding[0].descriptorCount = 5;
7093 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7094 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007095
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007096 // Create layout identical to set0 layout but w/ different stageFlags
7097 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007098 dsl_fs_stage_only.binding = 0;
7099 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7100 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007101 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7102 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007103 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007104 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007105 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7106 ds_layout_ci.pNext = NULL;
7107 ds_layout_ci.bindingCount = 1;
7108 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007109 static const uint32_t NUM_LAYOUTS = 4;
7110 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007111 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007112 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7113 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007114 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007115 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007116 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007118 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007119 dsl_binding[0].binding = 0;
7120 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007121 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007122 dsl_binding[1].binding = 1;
7123 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7124 dsl_binding[1].descriptorCount = 2;
7125 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7126 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007127 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007128 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007130 ASSERT_VK_SUCCESS(err);
7131 dsl_binding[0].binding = 0;
7132 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007133 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007134 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007136 ASSERT_VK_SUCCESS(err);
7137 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007140 ASSERT_VK_SUCCESS(err);
7141
7142 static const uint32_t NUM_SETS = 4;
7143 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7144 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007145 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007146 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007147 alloc_info.descriptorPool = ds_pool;
7148 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007149 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007150 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007151 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007152 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007153 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007154 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007155 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007156
7157 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007158 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7159 pipeline_layout_ci.pNext = NULL;
7160 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7161 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007162
7163 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007164 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007165 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007166 // Create pipelineLayout with only one setLayout
7167 pipeline_layout_ci.setLayoutCount = 1;
7168 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007169 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007170 ASSERT_VK_SUCCESS(err);
7171 // Create pipelineLayout with 2 descriptor setLayout at index 0
7172 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7173 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007174 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007175 ASSERT_VK_SUCCESS(err);
7176 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7177 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7178 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007179 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007180 ASSERT_VK_SUCCESS(err);
7181 // Create pipelineLayout with UB type, but stageFlags for FS only
7182 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7183 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007184 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007185 ASSERT_VK_SUCCESS(err);
7186 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7187 VkDescriptorSetLayout pl_bad_s0[2] = {};
7188 pl_bad_s0[0] = ds_layout_fs_only;
7189 pl_bad_s0[1] = ds_layout[1];
7190 pipeline_layout_ci.setLayoutCount = 2;
7191 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7192 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007193 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007194 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007195
Tobin Ehlis88452832015-12-03 09:40:56 -07007196 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007197 char const *vsSource =
7198 "#version 450\n"
7199 "\n"
7200 "out gl_PerVertex {\n"
7201 " vec4 gl_Position;\n"
7202 "};\n"
7203 "void main(){\n"
7204 " gl_Position = vec4(1);\n"
7205 "}\n";
7206 char const *fsSource =
7207 "#version 450\n"
7208 "\n"
7209 "layout(location=0) out vec4 x;\n"
7210 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7211 "void main(){\n"
7212 " x = vec4(bar.y);\n"
7213 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007214 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7215 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007216 VkPipelineObj pipe(m_device);
7217 pipe.AddShader(&vs);
7218 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007219 pipe.AddColorAttachment();
7220 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221
Tony Barbour552f6c02016-12-21 14:34:07 -07007222 m_commandBuffer->BeginCommandBuffer();
7223 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007226 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7227 // of PSO
7228 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7229 // cmd_pipeline.c
7230 // due to the fact that cmd_alloc_dset_data() has not been called in
7231 // cmd_bind_graphics_pipeline()
7232 // TODO : Want to cause various binding incompatibility issues here to test
7233 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007234 // First cause various verify_layout_compatibility() fails
7235 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007236 // verify_set_layout_compatibility fail cases:
7237 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007239 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7240 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007241 m_errorMonitor->VerifyFound();
7242
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007243 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7245 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7246 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007247 m_errorMonitor->VerifyFound();
7248
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007249 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007250 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7251 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7253 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7254 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007255 m_errorMonitor->VerifyFound();
7256
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007257 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7258 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7261 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007262 m_errorMonitor->VerifyFound();
7263
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007264 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7265 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7267 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7268 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7269 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007270 m_errorMonitor->VerifyFound();
7271
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007272 // Cause INFO messages due to disturbing previously bound Sets
7273 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007274 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7275 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007276 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7278 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7279 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007280 m_errorMonitor->VerifyFound();
7281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007282 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7283 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007284 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7286 " newly bound as set #0 so set #1 and "
7287 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7289 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007290 m_errorMonitor->VerifyFound();
7291
Tobin Ehlis10fad692016-07-07 12:00:36 -06007292 // Now that we're done actively using the pipelineLayout that gfx pipeline
7293 // was created with, we should be able to delete it. Do that now to verify
7294 // that validation obeys pipelineLayout lifetime
7295 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7296
Tobin Ehlis88452832015-12-03 09:40:56 -07007297 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007298 // 1. Error due to not binding required set (we actually use same code as
7299 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007300 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7301 &descriptorSet[0], 0, NULL);
7302 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7303 &descriptorSet[1], 0, NULL);
7304 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 -07007305
7306 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7307 VkRect2D scissor = {{0, 0}, {16, 16}};
7308 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7309 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7310
Tobin Ehlis88452832015-12-03 09:40:56 -07007311 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007312 m_errorMonitor->VerifyFound();
7313
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007314 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // 2. Error due to bound set not being compatible with PSO's
7316 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7318 &descriptorSet[0], 0, NULL);
7319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007320 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007321 m_errorMonitor->VerifyFound();
7322
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007323 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007324 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007325 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7326 }
7327 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007328 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7329 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7330}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331
Karl Schultz6addd812016-02-02 17:17:23 -07007332TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7334 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007335
Tony Barbour1fa09702017-03-16 12:09:08 -06007336 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007337 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007338 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007339 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007340
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007341 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007342}
7343
Karl Schultz6addd812016-02-02 17:17:23 -07007344TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7345 VkResult err;
7346 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007347
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007349
Tony Barbour1fa09702017-03-16 12:09:08 -06007350 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007351
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007352 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007353 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007354 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007355 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007357 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007358
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007359 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007360 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007361
7362 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007363 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007364 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7365
7366 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007367 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007368 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007369 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 -07007370 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007371
7372 // The error should be caught by validation of the BeginCommandBuffer call
7373 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007375 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007376 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007377}
7378
Karl Schultz6addd812016-02-02 17:17:23 -07007379TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007380 // Cause error due to Begin while recording CB
7381 // Then cause 2 errors for attempting to reset CB w/o having
7382 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7383 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007385
Tony Barbour1fa09702017-03-16 12:09:08 -06007386 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007387
7388 // Calls AllocateCommandBuffers
7389 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7390
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007391 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007392 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007393 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7394 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007395 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7396 cmd_buf_info.pNext = NULL;
7397 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007398 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007399
7400 // Begin CB to transition to recording state
7401 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7402 // Can't re-begin. This should trigger error
7403 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007404 m_errorMonitor->VerifyFound();
7405
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007407 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007408 // Reset attempt will trigger error due to incorrect CommandPool state
7409 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007410 m_errorMonitor->VerifyFound();
7411
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007413 // Transition CB to RECORDED state
7414 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7415 // Now attempting to Begin will implicitly reset, which triggers error
7416 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007417 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007418}
7419
Karl Schultz6addd812016-02-02 17:17:23 -07007420TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007421 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007422 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007423
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7425 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007426
Tony Barbour1fa09702017-03-16 12:09:08 -06007427 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007429
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007430 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007431 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7432 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007433
7434 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007435 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7436 ds_pool_ci.pNext = NULL;
7437 ds_pool_ci.maxSets = 1;
7438 ds_pool_ci.poolSizeCount = 1;
7439 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007440
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007441 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007442 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007443 ASSERT_VK_SUCCESS(err);
7444
Tony Barboureb254902015-07-15 12:50:33 -06007445 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007446 dsl_binding.binding = 0;
7447 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7448 dsl_binding.descriptorCount = 1;
7449 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7450 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007451
Tony Barboureb254902015-07-15 12:50:33 -06007452 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007453 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7454 ds_layout_ci.pNext = NULL;
7455 ds_layout_ci.bindingCount = 1;
7456 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007457
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007458 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007459 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007460 ASSERT_VK_SUCCESS(err);
7461
7462 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007463 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007464 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007465 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007466 alloc_info.descriptorPool = ds_pool;
7467 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007468 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007469 ASSERT_VK_SUCCESS(err);
7470
Tony Barboureb254902015-07-15 12:50:33 -06007471 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007472 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7473 pipeline_layout_ci.setLayoutCount = 1;
7474 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007475
7476 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007477 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007478 ASSERT_VK_SUCCESS(err);
7479
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007480 VkViewport vp = {}; // Just need dummy vp to point to
7481 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007482
7483 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007484 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7485 vp_state_ci.scissorCount = 1;
7486 vp_state_ci.pScissors = &sc;
7487 vp_state_ci.viewportCount = 1;
7488 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007489
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007490 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7491 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7492 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7493 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7494 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7495 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007496 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007497 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007498 rs_state_ci.lineWidth = 1.0f;
7499
7500 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7501 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7502 vi_ci.pNext = nullptr;
7503 vi_ci.vertexBindingDescriptionCount = 0;
7504 vi_ci.pVertexBindingDescriptions = nullptr;
7505 vi_ci.vertexAttributeDescriptionCount = 0;
7506 vi_ci.pVertexAttributeDescriptions = nullptr;
7507
7508 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7509 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7510 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7511
7512 VkPipelineShaderStageCreateInfo shaderStages[2];
7513 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7514
7515 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7516 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007517 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007518 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007519
Tony Barboureb254902015-07-15 12:50:33 -06007520 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007521 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7522 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007523 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007524 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7525 gp_ci.layout = pipeline_layout;
7526 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007527 gp_ci.pVertexInputState = &vi_ci;
7528 gp_ci.pInputAssemblyState = &ia_ci;
7529
7530 gp_ci.stageCount = 1;
7531 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007532
7533 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007534 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7535 pc_ci.initialDataSize = 0;
7536 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007537
7538 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007539 VkPipelineCache pipelineCache;
7540
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007541 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007542 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007543 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007544 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007545
Chia-I Wuf7458c52015-10-26 21:10:41 +08007546 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7547 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7548 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7549 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007550}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007551
Tobin Ehlis912df022015-09-17 08:46:18 -06007552/*// TODO : This test should be good, but needs Tess support in compiler to run
7553TEST_F(VkLayerTest, InvalidPatchControlPoints)
7554{
7555 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007556 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007557
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007559 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7560primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007561
Tony Barbour1fa09702017-03-16 12:09:08 -06007562 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007564
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007565 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007566 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007567 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007568
7569 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7570 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7571 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007572 ds_pool_ci.poolSizeCount = 1;
7573 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007574
7575 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007576 err = vkCreateDescriptorPool(m_device->device(),
7577VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007578 ASSERT_VK_SUCCESS(err);
7579
7580 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007581 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007582 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007583 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007584 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7585 dsl_binding.pImmutableSamplers = NULL;
7586
7587 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007588 ds_layout_ci.sType =
7589VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007590 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007591 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007592 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007593
7594 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7596&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007597 ASSERT_VK_SUCCESS(err);
7598
7599 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007600 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7601VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007602 ASSERT_VK_SUCCESS(err);
7603
7604 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007605 pipeline_layout_ci.sType =
7606VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007607 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007608 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007609 pipeline_layout_ci.pSetLayouts = &ds_layout;
7610
7611 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007612 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7613&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007614 ASSERT_VK_SUCCESS(err);
7615
7616 VkPipelineShaderStageCreateInfo shaderStages[3];
7617 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7618
Karl Schultz6addd812016-02-02 17:17:23 -07007619 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7620this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007621 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007622 VkShaderObj
7623tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7624this);
7625 VkShaderObj
7626te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7627this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007628
Karl Schultz6addd812016-02-02 17:17:23 -07007629 shaderStages[0].sType =
7630VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007631 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007632 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007633 shaderStages[1].sType =
7634VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007635 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007636 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007637 shaderStages[2].sType =
7638VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007639 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007640 shaderStages[2].shader = te.handle();
7641
7642 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007643 iaCI.sType =
7644VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007645 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007646
7647 VkPipelineTessellationStateCreateInfo tsCI = {};
7648 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7649 tsCI.patchControlPoints = 0; // This will cause an error
7650
7651 VkGraphicsPipelineCreateInfo gp_ci = {};
7652 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7653 gp_ci.pNext = NULL;
7654 gp_ci.stageCount = 3;
7655 gp_ci.pStages = shaderStages;
7656 gp_ci.pVertexInputState = NULL;
7657 gp_ci.pInputAssemblyState = &iaCI;
7658 gp_ci.pTessellationState = &tsCI;
7659 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007660 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007661 gp_ci.pMultisampleState = NULL;
7662 gp_ci.pDepthStencilState = NULL;
7663 gp_ci.pColorBlendState = NULL;
7664 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7665 gp_ci.layout = pipeline_layout;
7666 gp_ci.renderPass = renderPass();
7667
7668 VkPipelineCacheCreateInfo pc_ci = {};
7669 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7670 pc_ci.pNext = NULL;
7671 pc_ci.initialSize = 0;
7672 pc_ci.initialData = 0;
7673 pc_ci.maxSize = 0;
7674
7675 VkPipeline pipeline;
7676 VkPipelineCache pipelineCache;
7677
Karl Schultz6addd812016-02-02 17:17:23 -07007678 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7679&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007680 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007681 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7682&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007684 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007685
Chia-I Wuf7458c52015-10-26 21:10:41 +08007686 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7687 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7688 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7689 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007690}
7691*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007692
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007693TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007694 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007695
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007696 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007697
Tony Barbour1fa09702017-03-16 12:09:08 -06007698 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007701 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007702 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7703 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007704
7705 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007706 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7707 ds_pool_ci.maxSets = 1;
7708 ds_pool_ci.poolSizeCount = 1;
7709 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007710
7711 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007712 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007713 ASSERT_VK_SUCCESS(err);
7714
7715 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007716 dsl_binding.binding = 0;
7717 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7718 dsl_binding.descriptorCount = 1;
7719 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007720
7721 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007722 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7723 ds_layout_ci.bindingCount = 1;
7724 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007725
7726 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007727 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007728 ASSERT_VK_SUCCESS(err);
7729
7730 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007731 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007732 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007733 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007734 alloc_info.descriptorPool = ds_pool;
7735 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007736 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737 ASSERT_VK_SUCCESS(err);
7738
7739 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007740 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7741 pipeline_layout_ci.setLayoutCount = 1;
7742 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007743
7744 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007745 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007746 ASSERT_VK_SUCCESS(err);
7747
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007748 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007749 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007750 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007751 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007752 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007753 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007754
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007755 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7756 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7757 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7758 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7759 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7760 rs_state_ci.depthClampEnable = VK_FALSE;
7761 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7762 rs_state_ci.depthBiasEnable = VK_FALSE;
7763
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007764 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7765 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7766 vi_ci.pNext = nullptr;
7767 vi_ci.vertexBindingDescriptionCount = 0;
7768 vi_ci.pVertexBindingDescriptions = nullptr;
7769 vi_ci.vertexAttributeDescriptionCount = 0;
7770 vi_ci.pVertexAttributeDescriptions = nullptr;
7771
7772 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7773 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7774 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7775
7776 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7777 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7778 pipe_ms_state_ci.pNext = NULL;
7779 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7780 pipe_ms_state_ci.sampleShadingEnable = 0;
7781 pipe_ms_state_ci.minSampleShading = 1.0;
7782 pipe_ms_state_ci.pSampleMask = NULL;
7783
Cody Northropeb3a6c12015-10-05 14:44:45 -06007784 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007785 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007787 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007788 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007789 shaderStages[0] = vs.GetStageCreateInfo();
7790 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007791
7792 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7794 gp_ci.stageCount = 2;
7795 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007796 gp_ci.pVertexInputState = &vi_ci;
7797 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007798 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007799 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007800 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007801 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7802 gp_ci.layout = pipeline_layout;
7803 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007804
7805 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007806 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007807
7808 VkPipeline pipeline;
7809 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007810 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007811 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007812
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007813 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007814 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007815
7816 // Check case where multiViewport is disabled and viewport count is not 1
7817 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7820 vp_state_ci.scissorCount = 0;
7821 vp_state_ci.viewportCount = 0;
7822 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7823 m_errorMonitor->VerifyFound();
7824 } else {
7825 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007826 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007827 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007828 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007829
7830 // Check is that viewportcount and scissorcount match
7831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7832 vp_state_ci.scissorCount = 1;
7833 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7834 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7835 m_errorMonitor->VerifyFound();
7836
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007837 // Check case where multiViewport is enabled and viewport count is greater than max
7838 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7841 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7842 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7843 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7844 m_errorMonitor->VerifyFound();
7845 }
7846 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007847
Chia-I Wuf7458c52015-10-26 21:10:41 +08007848 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7849 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7850 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7851 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007853
7854// 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
7855// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007856TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007857 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007858
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007859 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7860
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007862
Tony Barbour1fa09702017-03-16 12:09:08 -06007863 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007865
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007866 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007867 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7868 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007869
7870 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007871 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7872 ds_pool_ci.maxSets = 1;
7873 ds_pool_ci.poolSizeCount = 1;
7874 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007875
7876 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007877 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007878 ASSERT_VK_SUCCESS(err);
7879
7880 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007881 dsl_binding.binding = 0;
7882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7883 dsl_binding.descriptorCount = 1;
7884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007885
7886 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007887 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7888 ds_layout_ci.bindingCount = 1;
7889 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007890
7891 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007892 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007893 ASSERT_VK_SUCCESS(err);
7894
7895 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007896 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007897 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007898 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007899 alloc_info.descriptorPool = ds_pool;
7900 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007901 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902 ASSERT_VK_SUCCESS(err);
7903
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007904 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7905 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7906 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7907
7908 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7909 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7910 vi_ci.pNext = nullptr;
7911 vi_ci.vertexBindingDescriptionCount = 0;
7912 vi_ci.pVertexBindingDescriptions = nullptr;
7913 vi_ci.vertexAttributeDescriptionCount = 0;
7914 vi_ci.pVertexAttributeDescriptions = nullptr;
7915
7916 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7917 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7918 pipe_ms_state_ci.pNext = NULL;
7919 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7920 pipe_ms_state_ci.sampleShadingEnable = 0;
7921 pipe_ms_state_ci.minSampleShading = 1.0;
7922 pipe_ms_state_ci.pSampleMask = NULL;
7923
Tobin Ehlise68360f2015-10-01 11:15:13 -06007924 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7926 pipeline_layout_ci.setLayoutCount = 1;
7927 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
7929 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007931 ASSERT_VK_SUCCESS(err);
7932
7933 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7934 // Set scissor as dynamic to avoid second error
7935 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007936 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7937 dyn_state_ci.dynamicStateCount = 1;
7938 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007939
Cody Northropeb3a6c12015-10-05 14:44:45 -06007940 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007941 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007942
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007943 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007944 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7945 // 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 +08007946 shaderStages[0] = vs.GetStageCreateInfo();
7947 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007948
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007949 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7950 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7951 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7952 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7953 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7954 rs_state_ci.depthClampEnable = VK_FALSE;
7955 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7956 rs_state_ci.depthBiasEnable = VK_FALSE;
7957
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007959 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7960 gp_ci.stageCount = 2;
7961 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007962 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007963 // Not setting VP state w/o dynamic vp state should cause validation error
7964 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007965 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007966 gp_ci.pVertexInputState = &vi_ci;
7967 gp_ci.pInputAssemblyState = &ia_ci;
7968 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007969 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7970 gp_ci.layout = pipeline_layout;
7971 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007972
7973 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007974 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975
7976 VkPipeline pipeline;
7977 VkPipelineCache pipelineCache;
7978
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007979 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007980 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007981 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007982
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007983 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007984
Chia-I Wuf7458c52015-10-26 21:10:41 +08007985 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7987 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7988 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007990
7991// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7992// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007993TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7994 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007995
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007997
Tony Barbour1fa09702017-03-16 12:09:08 -06007998 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007999
8000 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008001 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008002 return;
8003 }
8004
Tobin Ehlise68360f2015-10-01 11:15:13 -06008005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008007 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008008 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8009 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008010
8011 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008012 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8013 ds_pool_ci.maxSets = 1;
8014 ds_pool_ci.poolSizeCount = 1;
8015 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008016
8017 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008018 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019 ASSERT_VK_SUCCESS(err);
8020
8021 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008022 dsl_binding.binding = 0;
8023 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8024 dsl_binding.descriptorCount = 1;
8025 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008026
8027 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008028 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8029 ds_layout_ci.bindingCount = 1;
8030 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008031
8032 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008033 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008034 ASSERT_VK_SUCCESS(err);
8035
8036 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008037 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008038 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008039 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008040 alloc_info.descriptorPool = ds_pool;
8041 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008042 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008043 ASSERT_VK_SUCCESS(err);
8044
8045 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008046 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8047 pipeline_layout_ci.setLayoutCount = 1;
8048 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008049
8050 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008051 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008052 ASSERT_VK_SUCCESS(err);
8053
8054 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008055 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8056 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008057 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008058 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008059 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060
8061 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8062 // Set scissor as dynamic to avoid that error
8063 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008064 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8065 dyn_state_ci.dynamicStateCount = 1;
8066 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008068 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8069 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8070 pipe_ms_state_ci.pNext = NULL;
8071 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8072 pipe_ms_state_ci.sampleShadingEnable = 0;
8073 pipe_ms_state_ci.minSampleShading = 1.0;
8074 pipe_ms_state_ci.pSampleMask = NULL;
8075
Cody Northropeb3a6c12015-10-05 14:44:45 -06008076 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008077 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008079 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008080 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8081 // 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 +08008082 shaderStages[0] = vs.GetStageCreateInfo();
8083 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
Cody Northropf6622dc2015-10-06 10:33:21 -06008085 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8086 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8087 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008088 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008089 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008090 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008091 vi_ci.pVertexAttributeDescriptions = nullptr;
8092
8093 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8094 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8095 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8096
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008097 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008098 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008099 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008100 rs_ci.pNext = nullptr;
8101
Mark Youngc89c6312016-03-31 16:03:20 -06008102 VkPipelineColorBlendAttachmentState att = {};
8103 att.blendEnable = VK_FALSE;
8104 att.colorWriteMask = 0xf;
8105
Cody Northropf6622dc2015-10-06 10:33:21 -06008106 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8107 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8108 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008109 cb_ci.attachmentCount = 1;
8110 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008111
Tobin Ehlise68360f2015-10-01 11:15:13 -06008112 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008113 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8114 gp_ci.stageCount = 2;
8115 gp_ci.pStages = shaderStages;
8116 gp_ci.pVertexInputState = &vi_ci;
8117 gp_ci.pInputAssemblyState = &ia_ci;
8118 gp_ci.pViewportState = &vp_state_ci;
8119 gp_ci.pRasterizationState = &rs_ci;
8120 gp_ci.pColorBlendState = &cb_ci;
8121 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008122 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008123 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8124 gp_ci.layout = pipeline_layout;
8125 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008126
8127 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008128 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008129
8130 VkPipeline pipeline;
8131 VkPipelineCache pipelineCache;
8132
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008134 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008135 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008136
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008137 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008138
Tobin Ehlisd332f282015-10-02 11:00:56 -06008139 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008140 // First need to successfully create the PSO from above by setting
8141 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008142 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 -07008143
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008144 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008145 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008147 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008148 m_commandBuffer->BeginCommandBuffer();
8149 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008151 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008152 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008153 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008154 Draw(1, 0, 0, 0);
8155
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008156 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008157
8158 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8159 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8160 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8161 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008162 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008163}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008164
8165// 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 -07008166// viewportCount
8167TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8168 VkResult err;
8169
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008171
Tony Barbour1fa09702017-03-16 12:09:08 -06008172 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008173
8174 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008175 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008176 return;
8177 }
8178
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8180
8181 VkDescriptorPoolSize ds_type_count = {};
8182 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8183 ds_type_count.descriptorCount = 1;
8184
8185 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8186 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8187 ds_pool_ci.maxSets = 1;
8188 ds_pool_ci.poolSizeCount = 1;
8189 ds_pool_ci.pPoolSizes = &ds_type_count;
8190
8191 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008192 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008193 ASSERT_VK_SUCCESS(err);
8194
8195 VkDescriptorSetLayoutBinding dsl_binding = {};
8196 dsl_binding.binding = 0;
8197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8198 dsl_binding.descriptorCount = 1;
8199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8200
8201 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8202 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8203 ds_layout_ci.bindingCount = 1;
8204 ds_layout_ci.pBindings = &dsl_binding;
8205
8206 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008207 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008208 ASSERT_VK_SUCCESS(err);
8209
8210 VkDescriptorSet descriptorSet;
8211 VkDescriptorSetAllocateInfo alloc_info = {};
8212 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8213 alloc_info.descriptorSetCount = 1;
8214 alloc_info.descriptorPool = ds_pool;
8215 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008216 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008217 ASSERT_VK_SUCCESS(err);
8218
8219 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8220 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8221 pipeline_layout_ci.setLayoutCount = 1;
8222 pipeline_layout_ci.pSetLayouts = &ds_layout;
8223
8224 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008225 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008226 ASSERT_VK_SUCCESS(err);
8227
8228 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8229 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8230 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008231 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008232 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008233 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008234
8235 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8236 // Set scissor as dynamic to avoid that error
8237 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8238 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8239 dyn_state_ci.dynamicStateCount = 1;
8240 dyn_state_ci.pDynamicStates = &vp_state;
8241
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008242 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8243 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8244 pipe_ms_state_ci.pNext = NULL;
8245 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8246 pipe_ms_state_ci.sampleShadingEnable = 0;
8247 pipe_ms_state_ci.minSampleShading = 1.0;
8248 pipe_ms_state_ci.pSampleMask = NULL;
8249
Karl Schultz6addd812016-02-02 17:17:23 -07008250 VkPipelineShaderStageCreateInfo shaderStages[2];
8251 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008253 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008254 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8255 // 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 -07008256 shaderStages[0] = vs.GetStageCreateInfo();
8257 shaderStages[1] = fs.GetStageCreateInfo();
8258
8259 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8260 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8261 vi_ci.pNext = nullptr;
8262 vi_ci.vertexBindingDescriptionCount = 0;
8263 vi_ci.pVertexBindingDescriptions = nullptr;
8264 vi_ci.vertexAttributeDescriptionCount = 0;
8265 vi_ci.pVertexAttributeDescriptions = nullptr;
8266
8267 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8268 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8269 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8270
8271 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8272 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008273 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008274 rs_ci.pNext = nullptr;
8275
Mark Youngc89c6312016-03-31 16:03:20 -06008276 VkPipelineColorBlendAttachmentState att = {};
8277 att.blendEnable = VK_FALSE;
8278 att.colorWriteMask = 0xf;
8279
Karl Schultz6addd812016-02-02 17:17:23 -07008280 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8281 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8282 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008283 cb_ci.attachmentCount = 1;
8284 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008285
8286 VkGraphicsPipelineCreateInfo gp_ci = {};
8287 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8288 gp_ci.stageCount = 2;
8289 gp_ci.pStages = shaderStages;
8290 gp_ci.pVertexInputState = &vi_ci;
8291 gp_ci.pInputAssemblyState = &ia_ci;
8292 gp_ci.pViewportState = &vp_state_ci;
8293 gp_ci.pRasterizationState = &rs_ci;
8294 gp_ci.pColorBlendState = &cb_ci;
8295 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008296 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008297 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8298 gp_ci.layout = pipeline_layout;
8299 gp_ci.renderPass = renderPass();
8300
8301 VkPipelineCacheCreateInfo pc_ci = {};
8302 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8303
8304 VkPipeline pipeline;
8305 VkPipelineCache pipelineCache;
8306
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008307 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008308 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008309 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008310
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008311 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008312
8313 // Now hit second fail case where we set scissor w/ different count than PSO
8314 // First need to successfully create the PSO from above by setting
8315 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8317 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008319 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008320 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008321 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008322 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008323 m_commandBuffer->BeginCommandBuffer();
8324 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008325 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008326 VkViewport viewports[1] = {};
8327 viewports[0].width = 8;
8328 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008329 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008330 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008331 Draw(1, 0, 0, 0);
8332
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008333 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008334
Chia-I Wuf7458c52015-10-26 21:10:41 +08008335 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8336 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8337 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8338 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008339 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008340}
8341
Mark Young7394fdd2016-03-31 14:56:43 -06008342TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8343 VkResult err;
8344
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008346
Tony Barbour1fa09702017-03-16 12:09:08 -06008347 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8349
8350 VkDescriptorPoolSize ds_type_count = {};
8351 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8352 ds_type_count.descriptorCount = 1;
8353
8354 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8355 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8356 ds_pool_ci.maxSets = 1;
8357 ds_pool_ci.poolSizeCount = 1;
8358 ds_pool_ci.pPoolSizes = &ds_type_count;
8359
8360 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008361 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008362 ASSERT_VK_SUCCESS(err);
8363
8364 VkDescriptorSetLayoutBinding dsl_binding = {};
8365 dsl_binding.binding = 0;
8366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8367 dsl_binding.descriptorCount = 1;
8368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8369
8370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8371 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8372 ds_layout_ci.bindingCount = 1;
8373 ds_layout_ci.pBindings = &dsl_binding;
8374
8375 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008376 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008377 ASSERT_VK_SUCCESS(err);
8378
8379 VkDescriptorSet descriptorSet;
8380 VkDescriptorSetAllocateInfo alloc_info = {};
8381 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8382 alloc_info.descriptorSetCount = 1;
8383 alloc_info.descriptorPool = ds_pool;
8384 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008385 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008386 ASSERT_VK_SUCCESS(err);
8387
8388 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8389 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8390 pipeline_layout_ci.setLayoutCount = 1;
8391 pipeline_layout_ci.pSetLayouts = &ds_layout;
8392
8393 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008394 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008395 ASSERT_VK_SUCCESS(err);
8396
8397 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8398 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8399 vp_state_ci.scissorCount = 1;
8400 vp_state_ci.pScissors = NULL;
8401 vp_state_ci.viewportCount = 1;
8402 vp_state_ci.pViewports = NULL;
8403
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008404 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008405 // Set scissor as dynamic to avoid that error
8406 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8407 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8408 dyn_state_ci.dynamicStateCount = 2;
8409 dyn_state_ci.pDynamicStates = dynamic_states;
8410
8411 VkPipelineShaderStageCreateInfo shaderStages[2];
8412 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008414 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8415 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008416 this); // TODO - We shouldn't need a fragment shader
8417 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008418 shaderStages[0] = vs.GetStageCreateInfo();
8419 shaderStages[1] = fs.GetStageCreateInfo();
8420
8421 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8422 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8423 vi_ci.pNext = nullptr;
8424 vi_ci.vertexBindingDescriptionCount = 0;
8425 vi_ci.pVertexBindingDescriptions = nullptr;
8426 vi_ci.vertexAttributeDescriptionCount = 0;
8427 vi_ci.pVertexAttributeDescriptions = nullptr;
8428
8429 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8430 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8431 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8432
8433 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8434 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8435 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008436 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008437
Mark Young47107952016-05-02 15:59:55 -06008438 // Check too low (line width of -1.0f).
8439 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008440
8441 VkPipelineColorBlendAttachmentState att = {};
8442 att.blendEnable = VK_FALSE;
8443 att.colorWriteMask = 0xf;
8444
8445 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8446 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8447 cb_ci.pNext = nullptr;
8448 cb_ci.attachmentCount = 1;
8449 cb_ci.pAttachments = &att;
8450
8451 VkGraphicsPipelineCreateInfo gp_ci = {};
8452 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8453 gp_ci.stageCount = 2;
8454 gp_ci.pStages = shaderStages;
8455 gp_ci.pVertexInputState = &vi_ci;
8456 gp_ci.pInputAssemblyState = &ia_ci;
8457 gp_ci.pViewportState = &vp_state_ci;
8458 gp_ci.pRasterizationState = &rs_ci;
8459 gp_ci.pColorBlendState = &cb_ci;
8460 gp_ci.pDynamicState = &dyn_state_ci;
8461 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8462 gp_ci.layout = pipeline_layout;
8463 gp_ci.renderPass = renderPass();
8464
8465 VkPipelineCacheCreateInfo pc_ci = {};
8466 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8467
8468 VkPipeline pipeline;
8469 VkPipelineCache pipelineCache;
8470
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008471 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008472 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008473 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008474
8475 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008476 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008477
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008479
8480 // Check too high (line width of 65536.0f).
8481 rs_ci.lineWidth = 65536.0f;
8482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008484 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008486
8487 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008488 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008489
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008491
8492 dyn_state_ci.dynamicStateCount = 3;
8493
8494 rs_ci.lineWidth = 1.0f;
8495
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008496 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008497 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008498 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008499 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008500 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008501
8502 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008503 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008504 m_errorMonitor->VerifyFound();
8505
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008507
8508 // Check too high with dynamic setting.
8509 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8510 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008511 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008512
8513 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8514 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008517 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008518}
8519
Karl Schultz6addd812016-02-02 17:17:23 -07008520TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008521 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008523 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008524
Tony Barbour1fa09702017-03-16 12:09:08 -06008525 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008527
Tony Barbour552f6c02016-12-21 14:34:07 -07008528 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008529 // Don't care about RenderPass handle b/c error should be flagged before
8530 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008531 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008532
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008533 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008534}
8535
Karl Schultz6addd812016-02-02 17:17:23 -07008536TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008537 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8539 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008540
Tony Barbour1fa09702017-03-16 12:09:08 -06008541 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008543
Tony Barbour552f6c02016-12-21 14:34:07 -07008544 m_commandBuffer->BeginCommandBuffer();
8545 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008546 // Just create a dummy Renderpass that's non-NULL so we can get to the
8547 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008550 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008551}
8552
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008553TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008554 TEST_DESCRIPTION(
8555 "Begin a renderPass where clearValueCount is less than"
8556 "the number of renderPass attachments that use loadOp"
8557 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008558
Tony Barbour1fa09702017-03-16 12:09:08 -06008559 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8561
8562 // Create a renderPass with a single attachment that uses loadOp CLEAR
8563 VkAttachmentReference attach = {};
8564 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8565 VkSubpassDescription subpass = {};
8566 subpass.inputAttachmentCount = 1;
8567 subpass.pInputAttachments = &attach;
8568 VkRenderPassCreateInfo rpci = {};
8569 rpci.subpassCount = 1;
8570 rpci.pSubpasses = &subpass;
8571 rpci.attachmentCount = 1;
8572 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008573 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008574 // Set loadOp to CLEAR
8575 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8576 rpci.pAttachments = &attach_desc;
8577 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8578 VkRenderPass rp;
8579 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8580
8581 VkCommandBufferInheritanceInfo hinfo = {};
8582 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8583 hinfo.renderPass = VK_NULL_HANDLE;
8584 hinfo.subpass = 0;
8585 hinfo.framebuffer = VK_NULL_HANDLE;
8586 hinfo.occlusionQueryEnable = VK_FALSE;
8587 hinfo.queryFlags = 0;
8588 hinfo.pipelineStatistics = 0;
8589 VkCommandBufferBeginInfo info = {};
8590 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8591 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8592 info.pInheritanceInfo = &hinfo;
8593
8594 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8595 VkRenderPassBeginInfo rp_begin = {};
8596 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8597 rp_begin.pNext = NULL;
8598 rp_begin.renderPass = renderPass();
8599 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008600 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008601
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008603
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008604 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008605
8606 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008607
8608 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008609}
8610
Slawomir Cygan0808f392016-11-28 17:53:23 +01008611TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008612 TEST_DESCRIPTION(
8613 "Begin a renderPass where clearValueCount is greater than"
8614 "the number of renderPass attachments that use loadOp"
8615 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008616
Tony Barbour1fa09702017-03-16 12:09:08 -06008617 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8619
8620 // Create a renderPass with a single attachment that uses loadOp CLEAR
8621 VkAttachmentReference attach = {};
8622 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8623 VkSubpassDescription subpass = {};
8624 subpass.inputAttachmentCount = 1;
8625 subpass.pInputAttachments = &attach;
8626 VkRenderPassCreateInfo rpci = {};
8627 rpci.subpassCount = 1;
8628 rpci.pSubpasses = &subpass;
8629 rpci.attachmentCount = 1;
8630 VkAttachmentDescription attach_desc = {};
8631 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8632 // Set loadOp to CLEAR
8633 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8634 rpci.pAttachments = &attach_desc;
8635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8636 VkRenderPass rp;
8637 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8638
8639 VkCommandBufferBeginInfo info = {};
8640 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8641 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8642
8643 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8644 VkRenderPassBeginInfo rp_begin = {};
8645 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8646 rp_begin.pNext = NULL;
8647 rp_begin.renderPass = renderPass();
8648 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008649 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008650
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8652 " has a clearValueCount of"
8653 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008654
8655 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8656
8657 m_errorMonitor->VerifyFound();
8658
8659 vkDestroyRenderPass(m_device->device(), rp, NULL);
8660}
8661
Cody Northrop3bb4d962016-05-09 16:15:57 -06008662TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008663 TEST_DESCRIPTION("End a command buffer with an active render pass");
8664
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8666 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008667
Tony Barbour1fa09702017-03-16 12:09:08 -06008668 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8670
Tony Barbour552f6c02016-12-21 14:34:07 -07008671 m_commandBuffer->BeginCommandBuffer();
8672 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8673 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008674
8675 m_errorMonitor->VerifyFound();
8676
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008677 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8678 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008679}
8680
Karl Schultz6addd812016-02-02 17:17:23 -07008681TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008682 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8684 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008685
Tony Barbour1fa09702017-03-16 12:09:08 -06008686 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008688
Tony Barbour552f6c02016-12-21 14:34:07 -07008689 m_commandBuffer->BeginCommandBuffer();
8690 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008691
8692 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008693 vk_testing::Buffer dstBuffer;
8694 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008696 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008697
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008698 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008699}
8700
Karl Schultz6addd812016-02-02 17:17:23 -07008701TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8704 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008705
Tony Barbour1fa09702017-03-16 12:09:08 -06008706 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708
Tony Barbour552f6c02016-12-21 14:34:07 -07008709 m_commandBuffer->BeginCommandBuffer();
8710 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008711
8712 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008713 vk_testing::Buffer dstBuffer;
8714 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
Karl Schultz6addd812016-02-02 17:17:23 -07008716 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008717 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8718 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8719 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008721 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008722}
8723
Karl Schultz6addd812016-02-02 17:17:23 -07008724TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008725 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8727 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008728
Tony Barbour1fa09702017-03-16 12:09:08 -06008729 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008731
Tony Barbour552f6c02016-12-21 14:34:07 -07008732 m_commandBuffer->BeginCommandBuffer();
8733 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008734
Michael Lentine0a369f62016-02-03 16:51:46 -06008735 VkClearColorValue clear_color;
8736 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008737 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8738 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8739 const int32_t tex_width = 32;
8740 const int32_t tex_height = 32;
8741 VkImageCreateInfo image_create_info = {};
8742 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8743 image_create_info.pNext = NULL;
8744 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8745 image_create_info.format = tex_format;
8746 image_create_info.extent.width = tex_width;
8747 image_create_info.extent.height = tex_height;
8748 image_create_info.extent.depth = 1;
8749 image_create_info.mipLevels = 1;
8750 image_create_info.arrayLayers = 1;
8751 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8752 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008753 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008754
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008755 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008756 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008757
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008758 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008759
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008760 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008761
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008762 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008763}
8764
Karl Schultz6addd812016-02-02 17:17:23 -07008765TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008766 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8768 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008769
Tony Barbour1fa09702017-03-16 12:09:08 -06008770 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008772
Dave Houlton1d2022c2017-03-29 11:43:58 -06008773 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008774 if (!depth_format) {
8775 printf(" No Depth + Stencil format found. Skipped.\n");
8776 return;
8777 }
8778
Tony Barbour552f6c02016-12-21 14:34:07 -07008779 m_commandBuffer->BeginCommandBuffer();
8780 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008781
8782 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008783 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008784 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8785 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008786 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008787 image_create_info.extent.width = 64;
8788 image_create_info.extent.height = 64;
8789 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8790 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008791
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008792 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008793 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008794
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008795 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008796
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008797 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8798 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008799
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008800 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008801}
8802
Karl Schultz6addd812016-02-02 17:17:23 -07008803TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008804 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008805 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008806
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8808 "vkCmdClearAttachments(): This call "
8809 "must be issued inside an active "
8810 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008811
Tony Barbour1fa09702017-03-16 12:09:08 -06008812 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008814
8815 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008816 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817 ASSERT_VK_SUCCESS(err);
8818
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008819 VkClearAttachment color_attachment;
8820 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8821 color_attachment.clearValue.color.float32[0] = 0;
8822 color_attachment.clearValue.color.float32[1] = 0;
8823 color_attachment.clearValue.color.float32[2] = 0;
8824 color_attachment.clearValue.color.float32[3] = 0;
8825 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008826 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008827 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008828
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008829 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008830}
8831
Chris Forbes3b97e932016-09-07 11:29:24 +12008832TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008833 TEST_DESCRIPTION(
8834 "Test that an error is produced when CmdNextSubpass is "
8835 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008836
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8838 "vkCmdNextSubpass(): Attempted to advance "
8839 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008840
Tony Barbour1fa09702017-03-16 12:09:08 -06008841 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8843
Tony Barbour552f6c02016-12-21 14:34:07 -07008844 m_commandBuffer->BeginCommandBuffer();
8845 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008846
8847 // error here.
8848 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8849 m_errorMonitor->VerifyFound();
8850
Tony Barbour552f6c02016-12-21 14:34:07 -07008851 m_commandBuffer->EndRenderPass();
8852 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008853}
8854
Chris Forbes6d624702016-09-07 13:57:05 +12008855TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008856 TEST_DESCRIPTION(
8857 "Test that an error is produced when CmdEndRenderPass is "
8858 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008859
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8861 "vkCmdEndRenderPass(): Called before reaching "
8862 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008863
Tony Barbour1fa09702017-03-16 12:09:08 -06008864 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008865 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8866 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008869
8870 VkRenderPass rp;
8871 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8872 ASSERT_VK_SUCCESS(err);
8873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008874 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008875
8876 VkFramebuffer fb;
8877 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8878 ASSERT_VK_SUCCESS(err);
8879
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008880 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008881
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008882 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 +12008883
8884 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8885
8886 // Error here.
8887 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8888 m_errorMonitor->VerifyFound();
8889
8890 // Clean up.
8891 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8892 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8893}
8894
Karl Schultz9e66a292016-04-21 15:57:51 -06008895TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8896 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8898 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008899
Tony Barbour1fa09702017-03-16 12:09:08 -06008900 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008901 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008902
8903 VkBufferMemoryBarrier buf_barrier = {};
8904 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8905 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8906 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8907 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8908 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8909 buf_barrier.buffer = VK_NULL_HANDLE;
8910 buf_barrier.offset = 0;
8911 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008912 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8913 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008914
8915 m_errorMonitor->VerifyFound();
8916}
8917
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008918TEST_F(VkLayerTest, InvalidBarriers) {
8919 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8920
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008922
Tony Barbour1fa09702017-03-16 12:09:08 -06008923 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06008924 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008925 if (!depth_format) {
8926 printf(" No Depth + Stencil format found. Skipped.\n");
8927 return;
8928 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8930
8931 VkMemoryBarrier mem_barrier = {};
8932 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8933 mem_barrier.pNext = NULL;
8934 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8935 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008936 m_commandBuffer->BeginCommandBuffer();
8937 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008938 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008939 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008940 &mem_barrier, 0, nullptr, 0, nullptr);
8941 m_errorMonitor->VerifyFound();
8942
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008944 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008945 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 -06008946 ASSERT_TRUE(image.initialized());
8947 VkImageMemoryBarrier img_barrier = {};
8948 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8949 img_barrier.pNext = NULL;
8950 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8951 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8952 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8953 // New layout can't be UNDEFINED
8954 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8955 img_barrier.image = image.handle();
8956 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8957 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8958 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8959 img_barrier.subresourceRange.baseArrayLayer = 0;
8960 img_barrier.subresourceRange.baseMipLevel = 0;
8961 img_barrier.subresourceRange.layerCount = 1;
8962 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008963 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8964 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008965 m_errorMonitor->VerifyFound();
8966 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8967
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8969 "Subresource must have the sum of the "
8970 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008971 // baseArrayLayer + layerCount must be <= image's arrayLayers
8972 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008973 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8974 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008975 m_errorMonitor->VerifyFound();
8976 img_barrier.subresourceRange.baseArrayLayer = 0;
8977
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008979 // baseMipLevel + levelCount must be <= image's mipLevels
8980 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008981 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8982 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008983 m_errorMonitor->VerifyFound();
8984 img_barrier.subresourceRange.baseMipLevel = 0;
8985
Mike Weiblen7053aa32017-01-25 15:21:10 -07008986 // levelCount must be non-zero.
8987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8988 img_barrier.subresourceRange.levelCount = 0;
8989 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8990 nullptr, 0, nullptr, 1, &img_barrier);
8991 m_errorMonitor->VerifyFound();
8992 img_barrier.subresourceRange.levelCount = 1;
8993
8994 // layerCount must be non-zero.
8995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8996 img_barrier.subresourceRange.layerCount = 0;
8997 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8998 nullptr, 0, nullptr, 1, &img_barrier);
8999 m_errorMonitor->VerifyFound();
9000 img_barrier.subresourceRange.layerCount = 1;
9001
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009002 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 -06009003 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009004 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9005 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009006 VkBufferMemoryBarrier buf_barrier = {};
9007 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9008 buf_barrier.pNext = NULL;
9009 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9010 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9011 buf_barrier.buffer = buffer.handle();
9012 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9013 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9014 buf_barrier.offset = 0;
9015 buf_barrier.size = VK_WHOLE_SIZE;
9016 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009017 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9018 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009019 m_errorMonitor->VerifyFound();
9020 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9021
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023 buf_barrier.offset = 257;
9024 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009025 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9026 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009027 m_errorMonitor->VerifyFound();
9028 buf_barrier.offset = 0;
9029
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009031 buf_barrier.size = 257;
9032 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009033 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9034 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009035 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009036
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009037 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009038 m_errorMonitor->SetDesiredFailureMsg(
9039 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009040 "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 -06009041 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009042 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009043 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009044 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9045 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009046 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009047
9048 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009049 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009050 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9051 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009052 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009053
9054 // Having anything other than DEPTH or STENCIL is an error
9055 m_errorMonitor->SetDesiredFailureMsg(
9056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9057 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9058 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9059 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9060 nullptr, 0, nullptr, 1, &img_barrier);
9061 m_errorMonitor->VerifyFound();
9062
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009063 // Now test depth-only
9064 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009065 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9066 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009067 VkDepthStencilObj d_image(m_device);
9068 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9069 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009070 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009071 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009072 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009073
9074 // DEPTH bit must be set
9075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9076 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009077 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009078 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9079 0, nullptr, 0, nullptr, 1, &img_barrier);
9080 m_errorMonitor->VerifyFound();
9081
9082 // No bits other than DEPTH may be set
9083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9084 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9085 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009086 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9087 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009088 m_errorMonitor->VerifyFound();
9089 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009090
9091 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009092 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9093 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009094 VkDepthStencilObj s_image(m_device);
9095 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9096 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009097 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009098 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009099 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009100 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9102 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009103 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009104 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9105 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009106 m_errorMonitor->VerifyFound();
9107 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009108
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009109 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009110 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009111 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 -06009112 ASSERT_TRUE(c_image.initialized());
9113 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9114 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9115 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009116
9117 // COLOR bit must be set
9118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9119 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009120 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9122 nullptr, 0, nullptr, 1, &img_barrier);
9123 m_errorMonitor->VerifyFound();
9124
9125 // No bits other than COLOR may be set
9126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9127 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9128 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009129 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9130 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009131 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009132
Mike Weiblene6e01172017-03-07 22:18:40 -07009133 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9134 {
9135 VkImageObj img_color(m_device);
9136 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9137 ASSERT_TRUE(img_color.initialized());
9138
9139 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009140 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 -07009141 ASSERT_TRUE(img_ds.initialized());
9142
9143 VkImageObj img_xfer_src(m_device);
9144 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9145 ASSERT_TRUE(img_xfer_src.initialized());
9146
9147 VkImageObj img_xfer_dst(m_device);
9148 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9149 ASSERT_TRUE(img_xfer_dst.initialized());
9150
9151 VkImageObj img_sampled(m_device);
9152 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9153 ASSERT_TRUE(img_sampled.initialized());
9154
9155 VkImageObj img_input(m_device);
9156 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9157 ASSERT_TRUE(img_input.initialized());
9158
9159 const struct {
9160 VkImageObj &image_obj;
9161 VkImageLayout bad_layout;
9162 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9163 } bad_buffer_layouts[] = {
9164 // clang-format off
9165 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9166 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9167 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9168 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9169 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9170 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9171 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9172 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9173 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9174 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9175 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9176 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9177 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9178 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9179 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9180 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9181 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9182 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9183 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9184 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9185 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9186 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9187 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9188 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9189 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9190 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9191 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9192 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9193 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9194 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9195 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9196 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9197 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9198 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9199 // clang-format on
9200 };
9201 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9202
9203 for (uint32_t i = 0; i < layout_count; ++i) {
9204 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9205 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9206 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9207 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9208 : VK_IMAGE_ASPECT_COLOR_BIT;
9209
9210 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9211 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9213 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9214 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9215 m_errorMonitor->VerifyFound();
9216
9217 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9218 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9220 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9221 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9222 m_errorMonitor->VerifyFound();
9223 }
9224
9225 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9226 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9227 }
9228
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009229 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9230
9231 // Create command pool with incompatible queueflags
9232 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009233 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009234 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009235 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009236 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009237 }
9238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9239
9240 VkCommandPool command_pool;
9241 VkCommandPoolCreateInfo pool_create_info{};
9242 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9243 pool_create_info.queueFamilyIndex = queue_family_index;
9244 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9245 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9246
9247 // Allocate a command buffer
9248 VkCommandBuffer bad_command_buffer;
9249 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9250 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9251 command_buffer_allocate_info.commandPool = command_pool;
9252 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9253 command_buffer_allocate_info.commandBufferCount = 1;
9254 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9255
9256 VkCommandBufferBeginInfo cbbi = {};
9257 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9258 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9259 buf_barrier.offset = 0;
9260 buf_barrier.size = VK_WHOLE_SIZE;
9261 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9262 &buf_barrier, 0, nullptr);
9263 m_errorMonitor->VerifyFound();
9264
9265 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9266 vkEndCommandBuffer(bad_command_buffer);
9267 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009268 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009269 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009270 }
9271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9272 VkEvent event;
9273 VkEventCreateInfo event_create_info{};
9274 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9275 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9276 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9277 nullptr, 0, nullptr);
9278 m_errorMonitor->VerifyFound();
9279
9280 vkEndCommandBuffer(bad_command_buffer);
9281 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009282}
9283
Tony Barbour18ba25c2016-09-29 13:42:40 -06009284TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9285 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9286
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009288 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009289 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009290 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9291 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009292 ASSERT_TRUE(image.initialized());
9293
9294 VkImageMemoryBarrier barrier = {};
9295 VkImageSubresourceRange range;
9296 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9297 barrier.srcAccessMask = 0;
9298 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9299 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9300 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9301 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9302 barrier.image = image.handle();
9303 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9304 range.baseMipLevel = 0;
9305 range.levelCount = 1;
9306 range.baseArrayLayer = 0;
9307 range.layerCount = 1;
9308 barrier.subresourceRange = range;
9309 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9310 cmdbuf.BeginCommandBuffer();
9311 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9312 &barrier);
9313 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9314 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9315 barrier.srcAccessMask = 0;
9316 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9317 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9318 &barrier);
9319
9320 m_errorMonitor->VerifyFound();
9321}
9322
Karl Schultz6addd812016-02-02 17:17:23 -07009323TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009324 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009325 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009327
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009328 uint32_t const indices[] = {0};
9329 VkBufferCreateInfo buf_info = {};
9330 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9331 buf_info.size = 1024;
9332 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9333 buf_info.queueFamilyIndexCount = 1;
9334 buf_info.pQueueFamilyIndices = indices;
9335
9336 VkBuffer buffer;
9337 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9338 ASSERT_VK_SUCCESS(err);
9339
9340 VkMemoryRequirements requirements;
9341 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9342
9343 VkMemoryAllocateInfo alloc_info{};
9344 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9345 alloc_info.pNext = NULL;
9346 alloc_info.memoryTypeIndex = 0;
9347 alloc_info.allocationSize = requirements.size;
9348 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9349 ASSERT_TRUE(pass);
9350
9351 VkDeviceMemory memory;
9352 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9353 ASSERT_VK_SUCCESS(err);
9354
9355 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009356 ASSERT_VK_SUCCESS(err);
9357
Tony Barbour552f6c02016-12-21 14:34:07 -07009358 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009359 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009360
Karl Schultz6addd812016-02-02 17:17:23 -07009361 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9362 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009363 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9365 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009366 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009367
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009368 vkFreeMemory(m_device->device(), memory, NULL);
9369 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009370}
9371
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009372TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9373 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009374 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9376 VkBufferCreateInfo buffCI = {};
9377 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9378 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009379 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009380 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009381 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009382 uint32_t qfi[2];
9383 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009384 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009385
9386 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009387 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009388
9389 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9391 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9392 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009393 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009394 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009395
9396 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009397 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9399
9400 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9401 buffCI.queueFamilyIndexCount = 2;
9402 qfi[0] = 1;
9403 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009404 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009405 VkDeviceMemory mem;
9406 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009407 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009408
9409 VkMemoryAllocateInfo alloc_info = {};
9410 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9411 alloc_info.allocationSize = 1024;
9412 bool pass = false;
9413 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9414 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009415 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009416 return;
9417 }
9418 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009419 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009420
9421 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009422 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009423 m_commandBuffer->end();
9424 QueueCommandBuffer(false);
9425 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009426 vkDestroyBuffer(m_device->device(), ib2, NULL);
9427 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009428 }
9429
Tony Barbourdf4c0042016-06-01 15:55:43 -06009430 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009431}
9432
Karl Schultz6addd812016-02-02 17:17:23 -07009433TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009434 TEST_DESCRIPTION(
9435 "Attempt vkCmdExecuteCommands with a primary command buffer"
9436 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009437
Tony Barbour1fa09702017-03-16 12:09:08 -06009438 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009440
Chris Forbesf29a84f2016-10-06 18:39:28 +13009441 // An empty primary command buffer
9442 VkCommandBufferObj cb(m_device, m_commandPool);
9443 cb.BeginCommandBuffer();
9444 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009445
Chris Forbesf29a84f2016-10-06 18:39:28 +13009446 m_commandBuffer->BeginCommandBuffer();
9447 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9448 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009449
Chris Forbesf29a84f2016-10-06 18:39:28 +13009450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9451 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009452 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009453
9454 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009455}
9456
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009457TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009458 TEST_DESCRIPTION(
9459 "Attempt to update descriptor sets for images and buffers "
9460 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009461 VkResult err;
9462
Tony Barbour1fa09702017-03-16 12:09:08 -06009463 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009464 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9465 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9466 ds_type_count[i].type = VkDescriptorType(i);
9467 ds_type_count[i].descriptorCount = 1;
9468 }
9469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9471 ds_pool_ci.pNext = NULL;
9472 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9473 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9474 ds_pool_ci.pPoolSizes = ds_type_count;
9475
9476 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009478 ASSERT_VK_SUCCESS(err);
9479
9480 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009482 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9483 dsl_binding[i].binding = 0;
9484 dsl_binding[i].descriptorType = VkDescriptorType(i);
9485 dsl_binding[i].descriptorCount = 1;
9486 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9487 dsl_binding[i].pImmutableSamplers = NULL;
9488 }
9489
9490 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9491 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9492 ds_layout_ci.pNext = NULL;
9493 ds_layout_ci.bindingCount = 1;
9494 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9495 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9496 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009497 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009498 ASSERT_VK_SUCCESS(err);
9499 }
9500 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9501 VkDescriptorSetAllocateInfo alloc_info = {};
9502 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9503 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9504 alloc_info.descriptorPool = ds_pool;
9505 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009506 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009507 ASSERT_VK_SUCCESS(err);
9508
9509 // Create a buffer & bufferView to be used for invalid updates
9510 VkBufferCreateInfo buff_ci = {};
9511 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009512 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009513 buff_ci.size = 256;
9514 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009515 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009516 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9517 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009518
9519 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9520 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9521 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9522 ASSERT_VK_SUCCESS(err);
9523
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009524 VkMemoryRequirements mem_reqs;
9525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9526 VkMemoryAllocateInfo mem_alloc_info = {};
9527 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9528 mem_alloc_info.pNext = NULL;
9529 mem_alloc_info.memoryTypeIndex = 0;
9530 mem_alloc_info.allocationSize = mem_reqs.size;
9531 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9532 if (!pass) {
9533 vkDestroyBuffer(m_device->device(), buffer, NULL);
9534 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9535 return;
9536 }
9537 VkDeviceMemory mem;
9538 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9539 ASSERT_VK_SUCCESS(err);
9540 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9541 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009542
9543 VkBufferViewCreateInfo buff_view_ci = {};
9544 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9545 buff_view_ci.buffer = buffer;
9546 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9547 buff_view_ci.range = VK_WHOLE_SIZE;
9548 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009549 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009550 ASSERT_VK_SUCCESS(err);
9551
Tony Barbour415497c2017-01-24 10:06:09 -07009552 // Now get resources / view for storage_texel_buffer
9553 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9554 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9555 if (!pass) {
9556 vkDestroyBuffer(m_device->device(), buffer, NULL);
9557 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9558 vkFreeMemory(m_device->device(), mem, NULL);
9559 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9560 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9561 return;
9562 }
9563 VkDeviceMemory storage_texel_buffer_mem;
9564 VkBufferView storage_texel_buffer_view;
9565 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9566 ASSERT_VK_SUCCESS(err);
9567 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9568 ASSERT_VK_SUCCESS(err);
9569 buff_view_ci.buffer = storage_texel_buffer;
9570 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9571 ASSERT_VK_SUCCESS(err);
9572
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009573 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009574 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009575 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009576 image_ci.format = VK_FORMAT_UNDEFINED;
9577 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9578 VkFormat format = static_cast<VkFormat>(f);
9579 VkFormatProperties fProps = m_device->format_properties(format);
9580 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9581 image_ci.format = format;
9582 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9583 break;
9584 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9585 image_ci.format = format;
9586 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9587 break;
9588 }
9589 }
9590 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9591 return;
9592 }
9593
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009594 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9595 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009596 image_ci.extent.width = 64;
9597 image_ci.extent.height = 64;
9598 image_ci.extent.depth = 1;
9599 image_ci.mipLevels = 1;
9600 image_ci.arrayLayers = 1;
9601 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009602 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009603 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009604 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9605 VkImage image;
9606 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9607 ASSERT_VK_SUCCESS(err);
9608 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009609 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009610
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009611 VkMemoryAllocateInfo mem_alloc = {};
9612 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9613 mem_alloc.pNext = NULL;
9614 mem_alloc.allocationSize = 0;
9615 mem_alloc.memoryTypeIndex = 0;
9616 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9617 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009618 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009619 ASSERT_TRUE(pass);
9620 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9621 ASSERT_VK_SUCCESS(err);
9622 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9623 ASSERT_VK_SUCCESS(err);
9624 // Now create view for image
9625 VkImageViewCreateInfo image_view_ci = {};
9626 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9627 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009628 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009629 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9630 image_view_ci.subresourceRange.layerCount = 1;
9631 image_view_ci.subresourceRange.baseArrayLayer = 0;
9632 image_view_ci.subresourceRange.levelCount = 1;
9633 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9634 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009635 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009636 ASSERT_VK_SUCCESS(err);
9637
9638 VkDescriptorBufferInfo buff_info = {};
9639 buff_info.buffer = buffer;
9640 VkDescriptorImageInfo img_info = {};
9641 img_info.imageView = image_view;
9642 VkWriteDescriptorSet descriptor_write = {};
9643 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9644 descriptor_write.dstBinding = 0;
9645 descriptor_write.descriptorCount = 1;
9646 descriptor_write.pTexelBufferView = &buff_view;
9647 descriptor_write.pBufferInfo = &buff_info;
9648 descriptor_write.pImageInfo = &img_info;
9649
9650 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009651 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009652 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9653 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9654 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9655 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9656 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9657 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9658 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9659 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9660 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9661 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9662 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009663 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009664 // Start loop at 1 as SAMPLER desc type has no usage bit error
9665 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009666 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9667 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9668 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9669 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009670 descriptor_write.descriptorType = VkDescriptorType(i);
9671 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009673
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009674 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009675
9676 m_errorMonitor->VerifyFound();
9677 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009678 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9679 descriptor_write.pTexelBufferView = &buff_view;
9680 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 }
Tony Barbour415497c2017-01-24 10:06:09 -07009682
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009683 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9684 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009685 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009686 vkDestroyImageView(m_device->device(), image_view, NULL);
9687 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009688 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009689 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009690 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009691 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009692 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009693 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9694}
9695
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009696TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009697 TEST_DESCRIPTION(
9698 "Attempt to update buffer descriptor set that has incorrect "
9699 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009700 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009701 "2. range value of 0\n"
9702 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009703 VkResult err;
9704
Tony Barbour1fa09702017-03-16 12:09:08 -06009705 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009706 VkDescriptorPoolSize ds_type_count = {};
9707 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9708 ds_type_count.descriptorCount = 1;
9709
9710 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9711 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9712 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009713 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009714 ds_pool_ci.maxSets = 1;
9715 ds_pool_ci.poolSizeCount = 1;
9716 ds_pool_ci.pPoolSizes = &ds_type_count;
9717
9718 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009719 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009720 ASSERT_VK_SUCCESS(err);
9721
9722 // Create layout with single uniform buffer descriptor
9723 VkDescriptorSetLayoutBinding dsl_binding = {};
9724 dsl_binding.binding = 0;
9725 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9726 dsl_binding.descriptorCount = 1;
9727 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9728 dsl_binding.pImmutableSamplers = NULL;
9729
9730 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9731 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9732 ds_layout_ci.pNext = NULL;
9733 ds_layout_ci.bindingCount = 1;
9734 ds_layout_ci.pBindings = &dsl_binding;
9735 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009736 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009737 ASSERT_VK_SUCCESS(err);
9738
9739 VkDescriptorSet descriptor_set = {};
9740 VkDescriptorSetAllocateInfo alloc_info = {};
9741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9742 alloc_info.descriptorSetCount = 1;
9743 alloc_info.descriptorPool = ds_pool;
9744 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009746 ASSERT_VK_SUCCESS(err);
9747
9748 // Create a buffer to be used for invalid updates
9749 VkBufferCreateInfo buff_ci = {};
9750 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9751 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009752 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009753 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9754 VkBuffer buffer;
9755 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9756 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009757
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009758 // Have to bind memory to buffer before descriptor update
9759 VkMemoryAllocateInfo mem_alloc = {};
9760 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9761 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009762 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009763 mem_alloc.memoryTypeIndex = 0;
9764
9765 VkMemoryRequirements mem_reqs;
9766 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009767 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009768 if (!pass) {
9769 vkDestroyBuffer(m_device->device(), buffer, NULL);
9770 return;
9771 }
9772
9773 VkDeviceMemory mem;
9774 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9775 ASSERT_VK_SUCCESS(err);
9776 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9777 ASSERT_VK_SUCCESS(err);
9778
9779 VkDescriptorBufferInfo buff_info = {};
9780 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009781 // Cause error due to offset out of range
9782 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009783 buff_info.range = VK_WHOLE_SIZE;
9784 VkWriteDescriptorSet descriptor_write = {};
9785 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9786 descriptor_write.dstBinding = 0;
9787 descriptor_write.descriptorCount = 1;
9788 descriptor_write.pTexelBufferView = nullptr;
9789 descriptor_write.pBufferInfo = &buff_info;
9790 descriptor_write.pImageInfo = nullptr;
9791
9792 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9793 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009795
9796 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9797
9798 m_errorMonitor->VerifyFound();
9799 // Now cause error due to range of 0
9800 buff_info.offset = 0;
9801 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009803
9804 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9805
9806 m_errorMonitor->VerifyFound();
9807 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009808 buff_info.offset = 0;
9809 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009811
9812 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9813
9814 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009815 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009816 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9817 vkDestroyBuffer(m_device->device(), buffer, NULL);
9818 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9819 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9820}
9821
Tobin Ehlis845887e2017-02-02 19:01:44 -07009822TEST_F(VkLayerTest, DSBufferLimitErrors) {
9823 TEST_DESCRIPTION(
9824 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9825 "Test cases include:\n"
9826 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9827 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9828 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9829 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9830 VkResult err;
9831
Tony Barbour1fa09702017-03-16 12:09:08 -06009832 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009833 VkDescriptorPoolSize ds_type_count[2] = {};
9834 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9835 ds_type_count[0].descriptorCount = 1;
9836 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9837 ds_type_count[1].descriptorCount = 1;
9838
9839 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9840 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9841 ds_pool_ci.pNext = NULL;
9842 ds_pool_ci.maxSets = 1;
9843 ds_pool_ci.poolSizeCount = 2;
9844 ds_pool_ci.pPoolSizes = ds_type_count;
9845
9846 VkDescriptorPool ds_pool;
9847 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9848 ASSERT_VK_SUCCESS(err);
9849
9850 // Create layout with single uniform buffer & single storage buffer descriptor
9851 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9852 dsl_binding[0].binding = 0;
9853 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9854 dsl_binding[0].descriptorCount = 1;
9855 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9856 dsl_binding[0].pImmutableSamplers = NULL;
9857 dsl_binding[1].binding = 1;
9858 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9859 dsl_binding[1].descriptorCount = 1;
9860 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9861 dsl_binding[1].pImmutableSamplers = NULL;
9862
9863 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9864 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9865 ds_layout_ci.pNext = NULL;
9866 ds_layout_ci.bindingCount = 2;
9867 ds_layout_ci.pBindings = dsl_binding;
9868 VkDescriptorSetLayout ds_layout;
9869 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9870 ASSERT_VK_SUCCESS(err);
9871
9872 VkDescriptorSet descriptor_set = {};
9873 VkDescriptorSetAllocateInfo alloc_info = {};
9874 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9875 alloc_info.descriptorSetCount = 1;
9876 alloc_info.descriptorPool = ds_pool;
9877 alloc_info.pSetLayouts = &ds_layout;
9878 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9879 ASSERT_VK_SUCCESS(err);
9880
9881 // Create a buffer to be used for invalid updates
9882 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9883 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9884 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9885 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9886 VkBufferCreateInfo ub_ci = {};
9887 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9888 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9889 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9890 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9891 VkBuffer uniform_buffer;
9892 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9893 ASSERT_VK_SUCCESS(err);
9894 VkBufferCreateInfo sb_ci = {};
9895 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9896 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9897 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9898 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9899 VkBuffer storage_buffer;
9900 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9901 ASSERT_VK_SUCCESS(err);
9902 // Have to bind memory to buffer before descriptor update
9903 VkMemoryAllocateInfo mem_alloc = {};
9904 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9905 mem_alloc.pNext = NULL;
9906 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9907 mem_alloc.memoryTypeIndex = 0;
9908
Cort Stratton77a0d592017-02-17 13:14:13 -08009909 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9910 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9911 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9912 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9913 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009914 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009915 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009916 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009917 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009919 return;
9920 }
9921
9922 VkDeviceMemory mem;
9923 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009924 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009925 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009926 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9927 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9928 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9929 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9930 return;
9931 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009932 ASSERT_VK_SUCCESS(err);
9933 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9934 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009935 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009936 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9937 ASSERT_VK_SUCCESS(err);
9938
9939 VkDescriptorBufferInfo buff_info = {};
9940 buff_info.buffer = uniform_buffer;
9941 buff_info.range = ub_ci.size; // This will exceed limit
9942 VkWriteDescriptorSet descriptor_write = {};
9943 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9944 descriptor_write.dstBinding = 0;
9945 descriptor_write.descriptorCount = 1;
9946 descriptor_write.pTexelBufferView = nullptr;
9947 descriptor_write.pBufferInfo = &buff_info;
9948 descriptor_write.pImageInfo = nullptr;
9949
9950 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9951 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009952 if (max_ub_range != UINT32_MAX) {
9953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9954 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9955 m_errorMonitor->VerifyFound();
9956 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009957 // Reduce size of range to acceptable limit & cause offset error
9958 buff_info.range = max_ub_range;
9959 buff_info.offset = min_ub_align - 1;
9960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9961 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9962 m_errorMonitor->VerifyFound();
9963
9964 // Now break storage updates
9965 buff_info.buffer = storage_buffer;
9966 buff_info.range = sb_ci.size; // This will exceed limit
9967 buff_info.offset = 0; // Reset offset for this update
9968
9969 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9970 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009971 if (max_ub_range != UINT32_MAX) {
9972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9973 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9974 m_errorMonitor->VerifyFound();
9975 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009976
9977 // Reduce size of range to acceptable limit & cause offset error
9978 buff_info.range = max_sb_range;
9979 buff_info.offset = min_sb_align - 1;
9980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9981 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9982 m_errorMonitor->VerifyFound();
9983
9984 vkFreeMemory(m_device->device(), mem, NULL);
9985 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9986 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9987 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9988 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9989}
9990
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009991TEST_F(VkLayerTest, DSAspectBitsErrors) {
9992 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9993 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009994 TEST_DESCRIPTION(
9995 "Attempt to update descriptor sets for images "
9996 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009997 VkResult err;
9998
Tony Barbour1fa09702017-03-16 12:09:08 -06009999 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010000 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010001 if (!depth_format) {
10002 printf(" No Depth + Stencil format found. Skipped.\n");
10003 return;
10004 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010005 VkDescriptorPoolSize ds_type_count = {};
10006 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10007 ds_type_count.descriptorCount = 1;
10008
10009 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10010 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10011 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010012 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010013 ds_pool_ci.maxSets = 5;
10014 ds_pool_ci.poolSizeCount = 1;
10015 ds_pool_ci.pPoolSizes = &ds_type_count;
10016
10017 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010018 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010019 ASSERT_VK_SUCCESS(err);
10020
10021 VkDescriptorSetLayoutBinding dsl_binding = {};
10022 dsl_binding.binding = 0;
10023 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10024 dsl_binding.descriptorCount = 1;
10025 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10026 dsl_binding.pImmutableSamplers = NULL;
10027
10028 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10029 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10030 ds_layout_ci.pNext = NULL;
10031 ds_layout_ci.bindingCount = 1;
10032 ds_layout_ci.pBindings = &dsl_binding;
10033 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010034 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010035 ASSERT_VK_SUCCESS(err);
10036
10037 VkDescriptorSet descriptor_set = {};
10038 VkDescriptorSetAllocateInfo alloc_info = {};
10039 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10040 alloc_info.descriptorSetCount = 1;
10041 alloc_info.descriptorPool = ds_pool;
10042 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010043 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010044 ASSERT_VK_SUCCESS(err);
10045
10046 // Create an image to be used for invalid updates
10047 VkImageCreateInfo image_ci = {};
10048 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10049 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010050 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010051 image_ci.extent.width = 64;
10052 image_ci.extent.height = 64;
10053 image_ci.extent.depth = 1;
10054 image_ci.mipLevels = 1;
10055 image_ci.arrayLayers = 1;
10056 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010057 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010058 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10059 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10060 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10061 VkImage image;
10062 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10063 ASSERT_VK_SUCCESS(err);
10064 // Bind memory to image
10065 VkMemoryRequirements mem_reqs;
10066 VkDeviceMemory image_mem;
10067 bool pass;
10068 VkMemoryAllocateInfo mem_alloc = {};
10069 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10070 mem_alloc.pNext = NULL;
10071 mem_alloc.allocationSize = 0;
10072 mem_alloc.memoryTypeIndex = 0;
10073 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10074 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010075 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010076 ASSERT_TRUE(pass);
10077 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10078 ASSERT_VK_SUCCESS(err);
10079 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10080 ASSERT_VK_SUCCESS(err);
10081 // Now create view for image
10082 VkImageViewCreateInfo image_view_ci = {};
10083 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10084 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010085 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010086 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10087 image_view_ci.subresourceRange.layerCount = 1;
10088 image_view_ci.subresourceRange.baseArrayLayer = 0;
10089 image_view_ci.subresourceRange.levelCount = 1;
10090 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010091 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010092
10093 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010094 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010095 ASSERT_VK_SUCCESS(err);
10096
10097 VkDescriptorImageInfo img_info = {};
10098 img_info.imageView = image_view;
10099 VkWriteDescriptorSet descriptor_write = {};
10100 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10101 descriptor_write.dstBinding = 0;
10102 descriptor_write.descriptorCount = 1;
10103 descriptor_write.pTexelBufferView = NULL;
10104 descriptor_write.pBufferInfo = NULL;
10105 descriptor_write.pImageInfo = &img_info;
10106 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10107 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010108 const char *error_msg =
10109 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10110 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010112
10113 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10114
10115 m_errorMonitor->VerifyFound();
10116 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10117 vkDestroyImage(m_device->device(), image, NULL);
10118 vkFreeMemory(m_device->device(), image_mem, NULL);
10119 vkDestroyImageView(m_device->device(), image_view, NULL);
10120 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10122}
10123
Karl Schultz6addd812016-02-02 17:17:23 -070010124TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010125 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010126 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10129 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10130 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010131
Tony Barbour1fa09702017-03-16 12:09:08 -060010132 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010133 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010134 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010135 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10136 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010137
10138 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010139 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10140 ds_pool_ci.pNext = NULL;
10141 ds_pool_ci.maxSets = 1;
10142 ds_pool_ci.poolSizeCount = 1;
10143 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010144
Tobin Ehlis3b780662015-05-28 12:11:26 -060010145 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010146 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010147 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010148 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010149 dsl_binding.binding = 0;
10150 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10151 dsl_binding.descriptorCount = 1;
10152 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10153 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010154
Tony Barboureb254902015-07-15 12:50:33 -060010155 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010156 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10157 ds_layout_ci.pNext = NULL;
10158 ds_layout_ci.bindingCount = 1;
10159 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010160
Tobin Ehlis3b780662015-05-28 12:11:26 -060010161 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010163 ASSERT_VK_SUCCESS(err);
10164
10165 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010166 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010167 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010168 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010169 alloc_info.descriptorPool = ds_pool;
10170 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010172 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010173
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010174 VkSamplerCreateInfo sampler_ci = {};
10175 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10176 sampler_ci.pNext = NULL;
10177 sampler_ci.magFilter = VK_FILTER_NEAREST;
10178 sampler_ci.minFilter = VK_FILTER_NEAREST;
10179 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10180 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10181 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10182 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10183 sampler_ci.mipLodBias = 1.0;
10184 sampler_ci.anisotropyEnable = VK_FALSE;
10185 sampler_ci.maxAnisotropy = 1;
10186 sampler_ci.compareEnable = VK_FALSE;
10187 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10188 sampler_ci.minLod = 1.0;
10189 sampler_ci.maxLod = 1.0;
10190 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10191 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10192 VkSampler sampler;
10193 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10194 ASSERT_VK_SUCCESS(err);
10195
10196 VkDescriptorImageInfo info = {};
10197 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010198
10199 VkWriteDescriptorSet descriptor_write;
10200 memset(&descriptor_write, 0, sizeof(descriptor_write));
10201 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010202 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010203 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010204 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010205 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010206 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010207
10208 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10209
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010210 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010211
Chia-I Wuf7458c52015-10-26 21:10:41 +080010212 vkDestroySampler(m_device->device(), sampler, NULL);
10213 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10214 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010215}
10216
Karl Schultz6addd812016-02-02 17:17:23 -070010217TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010218 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010219 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010220
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010222
Tony Barbour1fa09702017-03-16 12:09:08 -060010223 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010224 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010225 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010226 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10227 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010228
10229 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010230 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10231 ds_pool_ci.pNext = NULL;
10232 ds_pool_ci.maxSets = 1;
10233 ds_pool_ci.poolSizeCount = 1;
10234 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010235
Tobin Ehlis3b780662015-05-28 12:11:26 -060010236 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010237 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010238 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010239
Tony Barboureb254902015-07-15 12:50:33 -060010240 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010241 dsl_binding.binding = 0;
10242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10243 dsl_binding.descriptorCount = 1;
10244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10245 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010246
10247 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010248 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10249 ds_layout_ci.pNext = NULL;
10250 ds_layout_ci.bindingCount = 1;
10251 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010252
Tobin Ehlis3b780662015-05-28 12:11:26 -060010253 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010255 ASSERT_VK_SUCCESS(err);
10256
10257 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010258 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010259 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010260 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010261 alloc_info.descriptorPool = ds_pool;
10262 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010263 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010264 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010265
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010266 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10267
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010268 // Correctly update descriptor to avoid "NOT_UPDATED" error
10269 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010270 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010271 buff_info.offset = 0;
10272 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010273
10274 VkWriteDescriptorSet descriptor_write;
10275 memset(&descriptor_write, 0, sizeof(descriptor_write));
10276 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010277 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010278 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010279 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010280 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10281 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010282
10283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10284
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010285 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010286
Chia-I Wuf7458c52015-10-26 21:10:41 +080010287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10288 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010289}
10290
Karl Schultz6addd812016-02-02 17:17:23 -070010291TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010292 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010293 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010294
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010296
Tony Barbour1fa09702017-03-16 12:09:08 -060010297 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010298 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010299 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010300 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10301 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010302
10303 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010304 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10305 ds_pool_ci.pNext = NULL;
10306 ds_pool_ci.maxSets = 1;
10307 ds_pool_ci.poolSizeCount = 1;
10308 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010309
Tobin Ehlis3b780662015-05-28 12:11:26 -060010310 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010312 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010313
Tony Barboureb254902015-07-15 12:50:33 -060010314 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010315 dsl_binding.binding = 0;
10316 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10317 dsl_binding.descriptorCount = 1;
10318 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10319 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010320
10321 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010322 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10323 ds_layout_ci.pNext = NULL;
10324 ds_layout_ci.bindingCount = 1;
10325 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010326 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010327 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010328 ASSERT_VK_SUCCESS(err);
10329
10330 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010331 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010332 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010333 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010334 alloc_info.descriptorPool = ds_pool;
10335 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010336 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010337 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010338
Tony Barboureb254902015-07-15 12:50:33 -060010339 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010340 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10341 sampler_ci.pNext = NULL;
10342 sampler_ci.magFilter = VK_FILTER_NEAREST;
10343 sampler_ci.minFilter = VK_FILTER_NEAREST;
10344 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10345 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10346 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10347 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10348 sampler_ci.mipLodBias = 1.0;
10349 sampler_ci.anisotropyEnable = VK_FALSE;
10350 sampler_ci.maxAnisotropy = 1;
10351 sampler_ci.compareEnable = VK_FALSE;
10352 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10353 sampler_ci.minLod = 1.0;
10354 sampler_ci.maxLod = 1.0;
10355 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10356 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010357
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010359 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010361
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010362 VkDescriptorImageInfo info = {};
10363 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010364
10365 VkWriteDescriptorSet descriptor_write;
10366 memset(&descriptor_write, 0, sizeof(descriptor_write));
10367 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010368 descriptor_write.dstSet = descriptorSet;
10369 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010370 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010371 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010372 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010373 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010374
10375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10376
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010377 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010378
Chia-I Wuf7458c52015-10-26 21:10:41 +080010379 vkDestroySampler(m_device->device(), sampler, NULL);
10380 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10381 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010382}
10383
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010384TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10385 // Create layout w/ empty binding and attempt to update it
10386 VkResult err;
10387
Tony Barbour1fa09702017-03-16 12:09:08 -060010388 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010389
10390 VkDescriptorPoolSize ds_type_count = {};
10391 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10392 ds_type_count.descriptorCount = 1;
10393
10394 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10395 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10396 ds_pool_ci.pNext = NULL;
10397 ds_pool_ci.maxSets = 1;
10398 ds_pool_ci.poolSizeCount = 1;
10399 ds_pool_ci.pPoolSizes = &ds_type_count;
10400
10401 VkDescriptorPool ds_pool;
10402 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10403 ASSERT_VK_SUCCESS(err);
10404
10405 VkDescriptorSetLayoutBinding dsl_binding = {};
10406 dsl_binding.binding = 0;
10407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10408 dsl_binding.descriptorCount = 0;
10409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10410 dsl_binding.pImmutableSamplers = NULL;
10411
10412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10414 ds_layout_ci.pNext = NULL;
10415 ds_layout_ci.bindingCount = 1;
10416 ds_layout_ci.pBindings = &dsl_binding;
10417 VkDescriptorSetLayout ds_layout;
10418 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10419 ASSERT_VK_SUCCESS(err);
10420
10421 VkDescriptorSet descriptor_set;
10422 VkDescriptorSetAllocateInfo alloc_info = {};
10423 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10424 alloc_info.descriptorSetCount = 1;
10425 alloc_info.descriptorPool = ds_pool;
10426 alloc_info.pSetLayouts = &ds_layout;
10427 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10428 ASSERT_VK_SUCCESS(err);
10429
10430 VkSamplerCreateInfo sampler_ci = {};
10431 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10432 sampler_ci.magFilter = VK_FILTER_NEAREST;
10433 sampler_ci.minFilter = VK_FILTER_NEAREST;
10434 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10435 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10436 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10437 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10438 sampler_ci.mipLodBias = 1.0;
10439 sampler_ci.maxAnisotropy = 1;
10440 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10441 sampler_ci.minLod = 1.0;
10442 sampler_ci.maxLod = 1.0;
10443 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10444
10445 VkSampler sampler;
10446 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10447 ASSERT_VK_SUCCESS(err);
10448
10449 VkDescriptorImageInfo info = {};
10450 info.sampler = sampler;
10451
10452 VkWriteDescriptorSet descriptor_write;
10453 memset(&descriptor_write, 0, sizeof(descriptor_write));
10454 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10455 descriptor_write.dstSet = descriptor_set;
10456 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010457 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010458 // This is the wrong type, but empty binding error will be flagged first
10459 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10460 descriptor_write.pImageInfo = &info;
10461
10462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10463 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10464 m_errorMonitor->VerifyFound();
10465
10466 vkDestroySampler(m_device->device(), sampler, NULL);
10467 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10468 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10469}
10470
Karl Schultz6addd812016-02-02 17:17:23 -070010471TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10472 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10473 // types
10474 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010476 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 -060010477
Tony Barbour1fa09702017-03-16 12:09:08 -060010478 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010479
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010480 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010481 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10482 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010483
10484 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010485 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10486 ds_pool_ci.pNext = NULL;
10487 ds_pool_ci.maxSets = 1;
10488 ds_pool_ci.poolSizeCount = 1;
10489 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010490
Tobin Ehlis3b780662015-05-28 12:11:26 -060010491 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010492 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010493 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010494 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010495 dsl_binding.binding = 0;
10496 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10497 dsl_binding.descriptorCount = 1;
10498 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10499 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010500
Tony Barboureb254902015-07-15 12:50:33 -060010501 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010502 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10503 ds_layout_ci.pNext = NULL;
10504 ds_layout_ci.bindingCount = 1;
10505 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010506
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010508 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010509 ASSERT_VK_SUCCESS(err);
10510
10511 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010512 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010513 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010514 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010515 alloc_info.descriptorPool = ds_pool;
10516 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010517 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010518 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010519
Tony Barboureb254902015-07-15 12:50:33 -060010520 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010521 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10522 sampler_ci.pNext = NULL;
10523 sampler_ci.magFilter = VK_FILTER_NEAREST;
10524 sampler_ci.minFilter = VK_FILTER_NEAREST;
10525 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10526 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10527 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10528 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10529 sampler_ci.mipLodBias = 1.0;
10530 sampler_ci.anisotropyEnable = VK_FALSE;
10531 sampler_ci.maxAnisotropy = 1;
10532 sampler_ci.compareEnable = VK_FALSE;
10533 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10534 sampler_ci.minLod = 1.0;
10535 sampler_ci.maxLod = 1.0;
10536 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10537 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010538 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010539 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010540 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010541
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010542 VkDescriptorImageInfo info = {};
10543 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010544
10545 VkWriteDescriptorSet descriptor_write;
10546 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010547 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010548 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010549 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010550 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010551 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010552 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010553
10554 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10555
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010556 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010557
Chia-I Wuf7458c52015-10-26 21:10:41 +080010558 vkDestroySampler(m_device->device(), sampler, NULL);
10559 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10560 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010561}
10562
Karl Schultz6addd812016-02-02 17:17:23 -070010563TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010564 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010565 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010566
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010568
Tony Barbour1fa09702017-03-16 12:09:08 -060010569 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010570 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10571 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010572 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010573 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10574 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010575
10576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10578 ds_pool_ci.pNext = NULL;
10579 ds_pool_ci.maxSets = 1;
10580 ds_pool_ci.poolSizeCount = 1;
10581 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010582
10583 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010584 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010585 ASSERT_VK_SUCCESS(err);
10586
10587 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010588 dsl_binding.binding = 0;
10589 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10590 dsl_binding.descriptorCount = 1;
10591 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10592 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010593
10594 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010595 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10596 ds_layout_ci.pNext = NULL;
10597 ds_layout_ci.bindingCount = 1;
10598 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010599 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010600 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010601 ASSERT_VK_SUCCESS(err);
10602
10603 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010604 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010605 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010606 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010607 alloc_info.descriptorPool = ds_pool;
10608 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010609 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010610 ASSERT_VK_SUCCESS(err);
10611
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010612 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010613
10614 VkDescriptorImageInfo descriptor_info;
10615 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10616 descriptor_info.sampler = sampler;
10617
10618 VkWriteDescriptorSet descriptor_write;
10619 memset(&descriptor_write, 0, sizeof(descriptor_write));
10620 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010621 descriptor_write.dstSet = descriptorSet;
10622 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010623 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010624 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10625 descriptor_write.pImageInfo = &descriptor_info;
10626
10627 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10628
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010629 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010630
Chia-I Wuf7458c52015-10-26 21:10:41 +080010631 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10632 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010633}
10634
Karl Schultz6addd812016-02-02 17:17:23 -070010635TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10636 // Create a single combined Image/Sampler descriptor and send it an invalid
10637 // imageView
10638 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010639
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010641
Tony Barbour1fa09702017-03-16 12:09:08 -060010642 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010643 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010644 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10645 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010646
10647 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010648 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10649 ds_pool_ci.pNext = NULL;
10650 ds_pool_ci.maxSets = 1;
10651 ds_pool_ci.poolSizeCount = 1;
10652 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010653
10654 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010655 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656 ASSERT_VK_SUCCESS(err);
10657
10658 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010659 dsl_binding.binding = 0;
10660 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10661 dsl_binding.descriptorCount = 1;
10662 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10663 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010664
10665 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010666 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10667 ds_layout_ci.pNext = NULL;
10668 ds_layout_ci.bindingCount = 1;
10669 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010670 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010671 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010672 ASSERT_VK_SUCCESS(err);
10673
10674 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010675 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010677 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010678 alloc_info.descriptorPool = ds_pool;
10679 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010681 ASSERT_VK_SUCCESS(err);
10682
10683 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010684 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10685 sampler_ci.pNext = NULL;
10686 sampler_ci.magFilter = VK_FILTER_NEAREST;
10687 sampler_ci.minFilter = VK_FILTER_NEAREST;
10688 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10689 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10690 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10691 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10692 sampler_ci.mipLodBias = 1.0;
10693 sampler_ci.anisotropyEnable = VK_FALSE;
10694 sampler_ci.maxAnisotropy = 1;
10695 sampler_ci.compareEnable = VK_FALSE;
10696 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10697 sampler_ci.minLod = 1.0;
10698 sampler_ci.maxLod = 1.0;
10699 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10700 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010701
10702 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010703 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010704 ASSERT_VK_SUCCESS(err);
10705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010706 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010707
10708 VkDescriptorImageInfo descriptor_info;
10709 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10710 descriptor_info.sampler = sampler;
10711 descriptor_info.imageView = view;
10712
10713 VkWriteDescriptorSet descriptor_write;
10714 memset(&descriptor_write, 0, sizeof(descriptor_write));
10715 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010716 descriptor_write.dstSet = descriptorSet;
10717 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010718 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010719 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10720 descriptor_write.pImageInfo = &descriptor_info;
10721
10722 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10723
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010724 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010725
Chia-I Wuf7458c52015-10-26 21:10:41 +080010726 vkDestroySampler(m_device->device(), sampler, NULL);
10727 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10728 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010729}
10730
Karl Schultz6addd812016-02-02 17:17:23 -070010731TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10732 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10733 // into the other
10734 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010735
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10737 " binding #1 with type "
10738 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10739 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010740
Tony Barbour1fa09702017-03-16 12:09:08 -060010741 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010742 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010743 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010744 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10745 ds_type_count[0].descriptorCount = 1;
10746 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10747 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010748
10749 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010750 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10751 ds_pool_ci.pNext = NULL;
10752 ds_pool_ci.maxSets = 1;
10753 ds_pool_ci.poolSizeCount = 2;
10754 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010755
10756 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010757 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010758 ASSERT_VK_SUCCESS(err);
10759 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010760 dsl_binding[0].binding = 0;
10761 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10762 dsl_binding[0].descriptorCount = 1;
10763 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10764 dsl_binding[0].pImmutableSamplers = NULL;
10765 dsl_binding[1].binding = 1;
10766 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10767 dsl_binding[1].descriptorCount = 1;
10768 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10769 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010770
10771 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010772 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10773 ds_layout_ci.pNext = NULL;
10774 ds_layout_ci.bindingCount = 2;
10775 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010776
10777 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010778 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010779 ASSERT_VK_SUCCESS(err);
10780
10781 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010782 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010783 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010784 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010785 alloc_info.descriptorPool = ds_pool;
10786 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010787 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010788 ASSERT_VK_SUCCESS(err);
10789
10790 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010791 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10792 sampler_ci.pNext = NULL;
10793 sampler_ci.magFilter = VK_FILTER_NEAREST;
10794 sampler_ci.minFilter = VK_FILTER_NEAREST;
10795 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10796 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10797 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10798 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10799 sampler_ci.mipLodBias = 1.0;
10800 sampler_ci.anisotropyEnable = VK_FALSE;
10801 sampler_ci.maxAnisotropy = 1;
10802 sampler_ci.compareEnable = VK_FALSE;
10803 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10804 sampler_ci.minLod = 1.0;
10805 sampler_ci.maxLod = 1.0;
10806 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10807 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010808
10809 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010810 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010811 ASSERT_VK_SUCCESS(err);
10812
10813 VkDescriptorImageInfo info = {};
10814 info.sampler = sampler;
10815
10816 VkWriteDescriptorSet descriptor_write;
10817 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10818 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010819 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010820 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010821 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010822 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10823 descriptor_write.pImageInfo = &info;
10824 // This write update should succeed
10825 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10826 // Now perform a copy update that fails due to type mismatch
10827 VkCopyDescriptorSet copy_ds_update;
10828 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10829 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10830 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010831 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010832 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010833 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10834 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010835 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10836
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010837 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010838 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010839 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 -060010840 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10841 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10842 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010843 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010844 copy_ds_update.dstSet = descriptorSet;
10845 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010846 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010847 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10848
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010849 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010850
Tobin Ehlis04356f92015-10-27 16:35:27 -060010851 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10853 " binding#1 with offset index of 1 plus "
10854 "update array offset of 0 and update of "
10855 "5 descriptors oversteps total number "
10856 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010857
Tobin Ehlis04356f92015-10-27 16:35:27 -060010858 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10859 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10860 copy_ds_update.srcSet = descriptorSet;
10861 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010862 copy_ds_update.dstSet = descriptorSet;
10863 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010864 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010865 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10866
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010867 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010868
Chia-I Wuf7458c52015-10-26 21:10:41 +080010869 vkDestroySampler(m_device->device(), sampler, NULL);
10870 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10871 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010872}
10873
Karl Schultz6addd812016-02-02 17:17:23 -070010874TEST_F(VkLayerTest, NumSamplesMismatch) {
10875 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10876 // sampleCount
10877 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010878
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010880
Tony Barbour1fa09702017-03-16 12:09:08 -060010881 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010883 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010884 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010885 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010886
10887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10889 ds_pool_ci.pNext = NULL;
10890 ds_pool_ci.maxSets = 1;
10891 ds_pool_ci.poolSizeCount = 1;
10892 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010893
Tobin Ehlis3b780662015-05-28 12:11:26 -060010894 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010895 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010896 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010897
Tony Barboureb254902015-07-15 12:50:33 -060010898 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010899 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010900 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010901 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010902 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10903 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010904
Tony Barboureb254902015-07-15 12:50:33 -060010905 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10906 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10907 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010908 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010909 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010910
Tobin Ehlis3b780662015-05-28 12:11:26 -060010911 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010913 ASSERT_VK_SUCCESS(err);
10914
10915 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010916 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010917 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010918 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010919 alloc_info.descriptorPool = ds_pool;
10920 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010921 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010922 ASSERT_VK_SUCCESS(err);
10923
Tony Barboureb254902015-07-15 12:50:33 -060010924 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010925 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010926 pipe_ms_state_ci.pNext = NULL;
10927 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10928 pipe_ms_state_ci.sampleShadingEnable = 0;
10929 pipe_ms_state_ci.minSampleShading = 1.0;
10930 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010931
Tony Barboureb254902015-07-15 12:50:33 -060010932 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010933 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10934 pipeline_layout_ci.pNext = NULL;
10935 pipeline_layout_ci.setLayoutCount = 1;
10936 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010937
10938 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010939 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010940 ASSERT_VK_SUCCESS(err);
10941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010943 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 -060010944 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010945 VkPipelineObj pipe(m_device);
10946 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010947 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010948 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010949 pipe.SetMSAA(&pipe_ms_state_ci);
10950 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010951
Tony Barbour552f6c02016-12-21 14:34:07 -070010952 m_commandBuffer->BeginCommandBuffer();
10953 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010954 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010955
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010956 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10957 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10958 VkRect2D scissor = {{0, 0}, {16, 16}};
10959 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10960
Mark Young29927482016-05-04 14:38:51 -060010961 // Render triangle (the error should trigger on the attempt to draw).
10962 Draw(3, 1, 0, 0);
10963
10964 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010965 m_commandBuffer->EndRenderPass();
10966 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010967
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010968 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010969
Chia-I Wuf7458c52015-10-26 21:10:41 +080010970 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10971 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10972 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010973}
Mark Young29927482016-05-04 14:38:51 -060010974
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010975TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010976 TEST_DESCRIPTION(
10977 "Hit RenderPass incompatible cases. "
10978 "Initial case is drawing with an active renderpass that's "
10979 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010980 VkResult err;
10981
Tony Barbour1fa09702017-03-16 12:09:08 -060010982 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10984
10985 VkDescriptorSetLayoutBinding dsl_binding = {};
10986 dsl_binding.binding = 0;
10987 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10988 dsl_binding.descriptorCount = 1;
10989 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10990 dsl_binding.pImmutableSamplers = NULL;
10991
10992 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10993 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10994 ds_layout_ci.pNext = NULL;
10995 ds_layout_ci.bindingCount = 1;
10996 ds_layout_ci.pBindings = &dsl_binding;
10997
10998 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010999 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011000 ASSERT_VK_SUCCESS(err);
11001
11002 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11003 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11004 pipeline_layout_ci.pNext = NULL;
11005 pipeline_layout_ci.setLayoutCount = 1;
11006 pipeline_layout_ci.pSetLayouts = &ds_layout;
11007
11008 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011009 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011010 ASSERT_VK_SUCCESS(err);
11011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011013 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 -060011014 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011015 // Create a renderpass that will be incompatible with default renderpass
11016 VkAttachmentReference attach = {};
11017 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11018 VkAttachmentReference color_att = {};
11019 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11020 VkSubpassDescription subpass = {};
11021 subpass.inputAttachmentCount = 1;
11022 subpass.pInputAttachments = &attach;
11023 subpass.colorAttachmentCount = 1;
11024 subpass.pColorAttachments = &color_att;
11025 VkRenderPassCreateInfo rpci = {};
11026 rpci.subpassCount = 1;
11027 rpci.pSubpasses = &subpass;
11028 rpci.attachmentCount = 1;
11029 VkAttachmentDescription attach_desc = {};
11030 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011031 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11032 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011033 rpci.pAttachments = &attach_desc;
11034 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11035 VkRenderPass rp;
11036 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11037 VkPipelineObj pipe(m_device);
11038 pipe.AddShader(&vs);
11039 pipe.AddShader(&fs);
11040 pipe.AddColorAttachment();
11041 VkViewport view_port = {};
11042 m_viewports.push_back(view_port);
11043 pipe.SetViewport(m_viewports);
11044 VkRect2D rect = {};
11045 m_scissors.push_back(rect);
11046 pipe.SetScissor(m_scissors);
11047 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11048
11049 VkCommandBufferInheritanceInfo cbii = {};
11050 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11051 cbii.renderPass = rp;
11052 cbii.subpass = 0;
11053 VkCommandBufferBeginInfo cbbi = {};
11054 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11055 cbbi.pInheritanceInfo = &cbii;
11056 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11057 VkRenderPassBeginInfo rpbi = {};
11058 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11059 rpbi.framebuffer = m_framebuffer;
11060 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011061 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11062 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011065 // Render triangle (the error should trigger on the attempt to draw).
11066 Draw(3, 1, 0, 0);
11067
11068 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011069 m_commandBuffer->EndRenderPass();
11070 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011071
11072 m_errorMonitor->VerifyFound();
11073
11074 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11075 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11076 vkDestroyRenderPass(m_device->device(), rp, NULL);
11077}
11078
Mark Youngc89c6312016-03-31 16:03:20 -060011079TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11080 // Create Pipeline where the number of blend attachments doesn't match the
11081 // number of color attachments. In this case, we don't add any color
11082 // blend attachments even though we have a color attachment.
11083 VkResult err;
11084
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011086
Tony Barbour1fa09702017-03-16 12:09:08 -060011087 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11089 VkDescriptorPoolSize ds_type_count = {};
11090 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11091 ds_type_count.descriptorCount = 1;
11092
11093 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11094 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11095 ds_pool_ci.pNext = NULL;
11096 ds_pool_ci.maxSets = 1;
11097 ds_pool_ci.poolSizeCount = 1;
11098 ds_pool_ci.pPoolSizes = &ds_type_count;
11099
11100 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011101 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011102 ASSERT_VK_SUCCESS(err);
11103
11104 VkDescriptorSetLayoutBinding dsl_binding = {};
11105 dsl_binding.binding = 0;
11106 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11107 dsl_binding.descriptorCount = 1;
11108 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11109 dsl_binding.pImmutableSamplers = NULL;
11110
11111 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11112 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11113 ds_layout_ci.pNext = NULL;
11114 ds_layout_ci.bindingCount = 1;
11115 ds_layout_ci.pBindings = &dsl_binding;
11116
11117 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011119 ASSERT_VK_SUCCESS(err);
11120
11121 VkDescriptorSet descriptorSet;
11122 VkDescriptorSetAllocateInfo alloc_info = {};
11123 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11124 alloc_info.descriptorSetCount = 1;
11125 alloc_info.descriptorPool = ds_pool;
11126 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011127 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011128 ASSERT_VK_SUCCESS(err);
11129
11130 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011131 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011132 pipe_ms_state_ci.pNext = NULL;
11133 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11134 pipe_ms_state_ci.sampleShadingEnable = 0;
11135 pipe_ms_state_ci.minSampleShading = 1.0;
11136 pipe_ms_state_ci.pSampleMask = NULL;
11137
11138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11140 pipeline_layout_ci.pNext = NULL;
11141 pipeline_layout_ci.setLayoutCount = 1;
11142 pipeline_layout_ci.pSetLayouts = &ds_layout;
11143
11144 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011146 ASSERT_VK_SUCCESS(err);
11147
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011149 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 -060011150 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011151 VkPipelineObj pipe(m_device);
11152 pipe.AddShader(&vs);
11153 pipe.AddShader(&fs);
11154 pipe.SetMSAA(&pipe_ms_state_ci);
11155 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011156 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011157
11158 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11159 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11160 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11161}
Mark Young29927482016-05-04 14:38:51 -060011162
Mark Muellerd4914412016-06-13 17:52:06 -060011163TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011164 TEST_DESCRIPTION(
11165 "Points to a wrong colorAttachment index in a VkClearAttachment "
11166 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011167 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011169
11170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11171 m_errorMonitor->VerifyFound();
11172}
11173
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011174TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011175 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11176 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011177
Tony Barbour1fa09702017-03-16 12:09:08 -060011178 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011179 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011180
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011181 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011182 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11183 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011184
11185 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11187 ds_pool_ci.pNext = NULL;
11188 ds_pool_ci.maxSets = 1;
11189 ds_pool_ci.poolSizeCount = 1;
11190 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011191
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011192 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011193 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011194 ASSERT_VK_SUCCESS(err);
11195
Tony Barboureb254902015-07-15 12:50:33 -060011196 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011197 dsl_binding.binding = 0;
11198 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11199 dsl_binding.descriptorCount = 1;
11200 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11201 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011202
Tony Barboureb254902015-07-15 12:50:33 -060011203 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011204 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11205 ds_layout_ci.pNext = NULL;
11206 ds_layout_ci.bindingCount = 1;
11207 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011208
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011209 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011211 ASSERT_VK_SUCCESS(err);
11212
11213 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011214 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011216 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011217 alloc_info.descriptorPool = ds_pool;
11218 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011220 ASSERT_VK_SUCCESS(err);
11221
Tony Barboureb254902015-07-15 12:50:33 -060011222 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011224 pipe_ms_state_ci.pNext = NULL;
11225 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11226 pipe_ms_state_ci.sampleShadingEnable = 0;
11227 pipe_ms_state_ci.minSampleShading = 1.0;
11228 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011229
Tony Barboureb254902015-07-15 12:50:33 -060011230 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011231 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11232 pipeline_layout_ci.pNext = NULL;
11233 pipeline_layout_ci.setLayoutCount = 1;
11234 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011235
11236 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011237 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011238 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011239
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011240 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011241 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011242 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011243 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011244
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011245 VkPipelineObj pipe(m_device);
11246 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011247 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011248 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011249 pipe.SetMSAA(&pipe_ms_state_ci);
11250 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011251
Tony Barbour552f6c02016-12-21 14:34:07 -070011252 m_commandBuffer->BeginCommandBuffer();
11253 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011254
Karl Schultz6addd812016-02-02 17:17:23 -070011255 // Main thing we care about for this test is that the VkImage obj we're
11256 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011257 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011258 VkClearAttachment color_attachment;
11259 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11260 color_attachment.clearValue.color.float32[0] = 1.0;
11261 color_attachment.clearValue.color.float32[1] = 1.0;
11262 color_attachment.clearValue.color.float32[2] = 1.0;
11263 color_attachment.clearValue.color.float32[3] = 1.0;
11264 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011265 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011266
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011267 // Call for full-sized FB Color attachment prior to issuing a Draw
11268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011269 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011270 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011271 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011272
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011273 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11274 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11276 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11277 m_errorMonitor->VerifyFound();
11278
11279 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11280 clear_rect.layerCount = 2;
11281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11282 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011283 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011284
Chia-I Wuf7458c52015-10-26 21:10:41 +080011285 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11286 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11287 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011288}
11289
Karl Schultz6addd812016-02-02 17:17:23 -070011290TEST_F(VkLayerTest, VtxBufferBadIndex) {
11291 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011292
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11294 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011295
Tony Barbour1fa09702017-03-16 12:09:08 -060011296 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011297 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011299
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011300 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011301 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11302 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011303
11304 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011305 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11306 ds_pool_ci.pNext = NULL;
11307 ds_pool_ci.maxSets = 1;
11308 ds_pool_ci.poolSizeCount = 1;
11309 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011310
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011311 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011312 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011313 ASSERT_VK_SUCCESS(err);
11314
Tony Barboureb254902015-07-15 12:50:33 -060011315 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011316 dsl_binding.binding = 0;
11317 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11318 dsl_binding.descriptorCount = 1;
11319 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11320 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011321
Tony Barboureb254902015-07-15 12:50:33 -060011322 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011323 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11324 ds_layout_ci.pNext = NULL;
11325 ds_layout_ci.bindingCount = 1;
11326 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011327
Tobin Ehlis502480b2015-06-24 15:53:07 -060011328 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011329 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011330 ASSERT_VK_SUCCESS(err);
11331
11332 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011333 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011334 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011335 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011336 alloc_info.descriptorPool = ds_pool;
11337 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011338 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011339 ASSERT_VK_SUCCESS(err);
11340
Tony Barboureb254902015-07-15 12:50:33 -060011341 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011343 pipe_ms_state_ci.pNext = NULL;
11344 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11345 pipe_ms_state_ci.sampleShadingEnable = 0;
11346 pipe_ms_state_ci.minSampleShading = 1.0;
11347 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011348
Tony Barboureb254902015-07-15 12:50:33 -060011349 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011350 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11351 pipeline_layout_ci.pNext = NULL;
11352 pipeline_layout_ci.setLayoutCount = 1;
11353 pipeline_layout_ci.pSetLayouts = &ds_layout;
11354 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011356 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011357 ASSERT_VK_SUCCESS(err);
11358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011359 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011360 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 -060011361 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011362 VkPipelineObj pipe(m_device);
11363 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011364 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011365 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011366 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011367 pipe.SetViewport(m_viewports);
11368 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011369 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011370
Tony Barbour552f6c02016-12-21 14:34:07 -070011371 m_commandBuffer->BeginCommandBuffer();
11372 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011373 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011374 // Don't care about actual data, just need to get to draw to flag error
11375 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011376 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011378 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011380 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011381
Chia-I Wuf7458c52015-10-26 21:10:41 +080011382 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11383 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11384 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011385}
Mark Muellerdfe37552016-07-07 14:47:42 -060011386
Mark Mueller2ee294f2016-08-04 12:59:48 -060011387TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011388 TEST_DESCRIPTION(
11389 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11390 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011391 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011392
Mark Mueller880fce52016-08-17 15:23:23 -060011393 // The following test fails with recent NVidia drivers.
11394 // By the time core_validation is reached, the NVidia
11395 // driver has sanitized the invalid condition and core_validation
11396 // is not introduced to the failure condition. This is not the case
11397 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011398 // uint32_t count = static_cast<uint32_t>(~0);
11399 // VkPhysicalDevice physical_device;
11400 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11401 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011402
Mark Mueller2ee294f2016-08-04 12:59:48 -060011403 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011404 VkDeviceQueueCreateInfo queue_create_info = {};
11405 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11406 queue_create_info.queueCount = 1;
11407 queue_create_info.pQueuePriorities = &queue_priority;
11408 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11409
11410 VkPhysicalDeviceFeatures features = m_device->phy().features();
11411 VkDevice testDevice;
11412 VkDeviceCreateInfo device_create_info = {};
11413 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11414 device_create_info.queueCreateInfoCount = 1;
11415 device_create_info.pQueueCreateInfos = &queue_create_info;
11416 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011417
11418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11419 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011420 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11421 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11422 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011423 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11424 m_errorMonitor->VerifyFound();
11425
11426 queue_create_info.queueFamilyIndex = 1;
11427
11428 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11429 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11430 for (unsigned i = 0; i < feature_count; i++) {
11431 if (VK_FALSE == feature_array[i]) {
11432 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011433 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11435 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011436 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11437 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11438 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11440 "You requested features that are unavailable on this device. You should first "
11441 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011442 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11443 m_errorMonitor->VerifyFound();
11444 break;
11445 }
11446 }
11447}
11448
Tobin Ehlis16edf082016-11-21 12:33:49 -070011449TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11450 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11451
Tony Barbour1fa09702017-03-16 12:09:08 -060011452 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011453
11454 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11455 std::vector<VkDeviceQueueCreateInfo> queue_info;
11456 queue_info.reserve(queue_props.size());
11457 std::vector<std::vector<float>> queue_priorities;
11458 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11459 VkDeviceQueueCreateInfo qi{};
11460 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11461 qi.queueFamilyIndex = i;
11462 qi.queueCount = queue_props[i].queueCount;
11463 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11464 qi.pQueuePriorities = queue_priorities[i].data();
11465 queue_info.push_back(qi);
11466 }
11467
11468 std::vector<const char *> device_extension_names;
11469
11470 VkDevice local_device;
11471 VkDeviceCreateInfo device_create_info = {};
11472 auto features = m_device->phy().features();
11473 // Intentionally disable pipeline stats
11474 features.pipelineStatisticsQuery = VK_FALSE;
11475 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11476 device_create_info.pNext = NULL;
11477 device_create_info.queueCreateInfoCount = queue_info.size();
11478 device_create_info.pQueueCreateInfos = queue_info.data();
11479 device_create_info.enabledLayerCount = 0;
11480 device_create_info.ppEnabledLayerNames = NULL;
11481 device_create_info.pEnabledFeatures = &features;
11482 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11483 ASSERT_VK_SUCCESS(err);
11484
11485 VkQueryPoolCreateInfo qpci{};
11486 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11487 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11488 qpci.queryCount = 1;
11489 VkQueryPool query_pool;
11490
11491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11492 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11493 m_errorMonitor->VerifyFound();
11494
11495 vkDestroyDevice(local_device, nullptr);
11496}
11497
Mark Mueller2ee294f2016-08-04 12:59:48 -060011498TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011499 TEST_DESCRIPTION(
11500 "Use an invalid queue index in a vkCmdWaitEvents call."
11501 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011502
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011503 const char *invalid_queue_index =
11504 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11505 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11506 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011507
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011508 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011511
Tony Barbour1fa09702017-03-16 12:09:08 -060011512 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011513
11514 VkEvent event;
11515 VkEventCreateInfo event_create_info{};
11516 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11517 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11518
Mark Mueller2ee294f2016-08-04 12:59:48 -060011519 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011520 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011521
Tony Barbour552f6c02016-12-21 14:34:07 -070011522 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011523
11524 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011525 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 -060011526 ASSERT_TRUE(image.initialized());
11527 VkImageMemoryBarrier img_barrier = {};
11528 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11529 img_barrier.pNext = NULL;
11530 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11531 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11532 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11533 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11534 img_barrier.image = image.handle();
11535 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011536
11537 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11538 // that layer validation catches the case when it is not.
11539 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011540 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11541 img_barrier.subresourceRange.baseArrayLayer = 0;
11542 img_barrier.subresourceRange.baseMipLevel = 0;
11543 img_barrier.subresourceRange.layerCount = 1;
11544 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11546 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011547 m_errorMonitor->VerifyFound();
11548
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011550
11551 VkQueryPool query_pool;
11552 VkQueryPoolCreateInfo query_pool_create_info = {};
11553 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11554 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11555 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011556 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011558 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011559 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11560
11561 vkEndCommandBuffer(m_commandBuffer->handle());
11562 m_errorMonitor->VerifyFound();
11563
11564 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11565 vkDestroyEvent(m_device->device(), event, nullptr);
11566}
11567
Mark Muellerdfe37552016-07-07 14:47:42 -060011568TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011569 TEST_DESCRIPTION(
11570 "Submit a command buffer using deleted vertex buffer, "
11571 "delete a buffer twice, use an invalid offset for each "
11572 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011573
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011574 const char *deleted_buffer_in_command_buffer =
11575 "Cannot submit cmd buffer "
11576 "using deleted buffer ";
11577 const char *invalid_offset_message =
11578 "vkBindBufferMemory(): "
11579 "memoryOffset is 0x";
11580 const char *invalid_storage_buffer_offset_message =
11581 "vkBindBufferMemory(): "
11582 "storage memoryOffset "
11583 "is 0x";
11584 const char *invalid_texel_buffer_offset_message =
11585 "vkBindBufferMemory(): "
11586 "texel memoryOffset "
11587 "is 0x";
11588 const char *invalid_uniform_buffer_offset_message =
11589 "vkBindBufferMemory(): "
11590 "uniform memoryOffset "
11591 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011592
Tony Barbour1fa09702017-03-16 12:09:08 -060011593 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011594 ASSERT_NO_FATAL_FAILURE(InitViewport());
11595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11596
11597 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011598 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011599 pipe_ms_state_ci.pNext = NULL;
11600 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11601 pipe_ms_state_ci.sampleShadingEnable = 0;
11602 pipe_ms_state_ci.minSampleShading = 1.0;
11603 pipe_ms_state_ci.pSampleMask = nullptr;
11604
11605 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11606 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11607 VkPipelineLayout pipeline_layout;
11608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011609 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011610 ASSERT_VK_SUCCESS(err);
11611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011612 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11613 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011614 VkPipelineObj pipe(m_device);
11615 pipe.AddShader(&vs);
11616 pipe.AddShader(&fs);
11617 pipe.AddColorAttachment();
11618 pipe.SetMSAA(&pipe_ms_state_ci);
11619 pipe.SetViewport(m_viewports);
11620 pipe.SetScissor(m_scissors);
11621 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11622
Tony Barbour552f6c02016-12-21 14:34:07 -070011623 m_commandBuffer->BeginCommandBuffer();
11624 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011626
11627 {
11628 // Create and bind a vertex buffer in a reduced scope, which will cause
11629 // it to be deleted upon leaving this scope
11630 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011631 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011632 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11633 draw_verticies.AddVertexInputToPipe(pipe);
11634 }
11635
11636 Draw(1, 0, 0, 0);
11637
Tony Barbour552f6c02016-12-21 14:34:07 -070011638 m_commandBuffer->EndRenderPass();
11639 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011642 QueueCommandBuffer(false);
11643 m_errorMonitor->VerifyFound();
11644
11645 {
11646 // Create and bind a vertex buffer in a reduced scope, and delete it
11647 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011650 buffer_test.TestDoubleDestroy();
11651 }
11652 m_errorMonitor->VerifyFound();
11653
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011654 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011655 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011656 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011658 m_errorMonitor->SetUnexpectedError(
11659 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11660 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011661 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11662 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011663 m_errorMonitor->VerifyFound();
11664 }
11665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11667 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011668 // Create and bind a memory buffer with an invalid offset again,
11669 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011671 m_errorMonitor->SetUnexpectedError(
11672 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11673 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11675 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011676 m_errorMonitor->VerifyFound();
11677 }
11678
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011679 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011680 // Create and bind a memory buffer with an invalid offset again, but
11681 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011683 m_errorMonitor->SetUnexpectedError(
11684 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11685 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011686 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11687 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011688 m_errorMonitor->VerifyFound();
11689 }
11690
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011691 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011692 // Create and bind a memory buffer with an invalid offset again, but
11693 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011695 m_errorMonitor->SetUnexpectedError(
11696 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11697 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011698 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11699 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011700 m_errorMonitor->VerifyFound();
11701 }
11702
11703 {
11704 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011706 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11707 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011708 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11709 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011710 m_errorMonitor->VerifyFound();
11711 }
11712
11713 {
11714 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011716 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11717 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011718 }
11719 m_errorMonitor->VerifyFound();
11720
11721 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11722}
11723
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011724// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11725TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011726 TEST_DESCRIPTION(
11727 "Hit all possible validation checks associated with the "
11728 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11729 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011730 // 3 in ValidateCmdBufImageLayouts
11731 // * -1 Attempt to submit cmd buf w/ deleted image
11732 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11733 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011734
Tony Barbour1fa09702017-03-16 12:09:08 -060011735 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011736 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011737 if (!depth_format) {
11738 printf(" No Depth + Stencil format found. Skipped.\n");
11739 return;
11740 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011741 // Create src & dst images to use for copy operations
11742 VkImage src_image;
11743 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011744 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011745
11746 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11747 const int32_t tex_width = 32;
11748 const int32_t tex_height = 32;
11749
11750 VkImageCreateInfo image_create_info = {};
11751 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11752 image_create_info.pNext = NULL;
11753 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11754 image_create_info.format = tex_format;
11755 image_create_info.extent.width = tex_width;
11756 image_create_info.extent.height = tex_height;
11757 image_create_info.extent.depth = 1;
11758 image_create_info.mipLevels = 1;
11759 image_create_info.arrayLayers = 4;
11760 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11761 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11762 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011763 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011764 image_create_info.flags = 0;
11765
11766 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11767 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011768 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011769 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11770 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011771 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11772 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11773 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11774 ASSERT_VK_SUCCESS(err);
11775
11776 // Allocate memory
11777 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011778 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011779 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011780 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11781 mem_alloc.pNext = NULL;
11782 mem_alloc.allocationSize = 0;
11783 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011784
11785 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011786 mem_alloc.allocationSize = img_mem_reqs.size;
11787 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011788 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011789 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011790 ASSERT_VK_SUCCESS(err);
11791
11792 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011793 mem_alloc.allocationSize = img_mem_reqs.size;
11794 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011795 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011796 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011797 ASSERT_VK_SUCCESS(err);
11798
11799 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011800 mem_alloc.allocationSize = img_mem_reqs.size;
11801 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011802 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011803 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011804 ASSERT_VK_SUCCESS(err);
11805
11806 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11807 ASSERT_VK_SUCCESS(err);
11808 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11809 ASSERT_VK_SUCCESS(err);
11810 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11811 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011812
Tony Barbour552f6c02016-12-21 14:34:07 -070011813 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011814 VkImageCopy copy_region;
11815 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11816 copy_region.srcSubresource.mipLevel = 0;
11817 copy_region.srcSubresource.baseArrayLayer = 0;
11818 copy_region.srcSubresource.layerCount = 1;
11819 copy_region.srcOffset.x = 0;
11820 copy_region.srcOffset.y = 0;
11821 copy_region.srcOffset.z = 0;
11822 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11823 copy_region.dstSubresource.mipLevel = 0;
11824 copy_region.dstSubresource.baseArrayLayer = 0;
11825 copy_region.dstSubresource.layerCount = 1;
11826 copy_region.dstOffset.x = 0;
11827 copy_region.dstOffset.y = 0;
11828 copy_region.dstOffset.z = 0;
11829 copy_region.extent.width = 1;
11830 copy_region.extent.height = 1;
11831 copy_region.extent.depth = 1;
11832
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11834 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11835 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011836
Cort530cf382016-12-08 09:59:47 -080011837 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 -060011838 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011839 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11840 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011841 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11842 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011843 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 -060011844 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011846 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11847 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011848 m_errorMonitor->SetUnexpectedError(
11849 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011850 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 -060011851 m_errorMonitor->VerifyFound();
11852 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011854 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011855 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011856 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011857 "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 -080011858 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 -060011859 m_errorMonitor->VerifyFound();
11860 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11862 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11863 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011864 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 -060011865 m_errorMonitor->VerifyFound();
11866 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011868 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011869 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011870 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011871 "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 -080011872 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 -060011873 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011875 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11876 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011877 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011878 "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 -080011879 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 -060011880 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011881
Cort3b021012016-12-07 12:00:57 -080011882 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11883 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11884 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11885 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11886 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11887 transfer_dst_image_barrier[0].srcAccessMask = 0;
11888 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11889 transfer_dst_image_barrier[0].image = dst_image;
11890 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11891 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11892 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11893 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11894 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11895 transfer_dst_image_barrier[0].image = depth_image;
11896 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11897 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11898 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11899
11900 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011901 VkClearColorValue color_clear_value = {};
11902 VkImageSubresourceRange clear_range;
11903 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11904 clear_range.baseMipLevel = 0;
11905 clear_range.baseArrayLayer = 0;
11906 clear_range.layerCount = 1;
11907 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011908
Cort3b021012016-12-07 12:00:57 -080011909 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11910 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011913 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011914 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011915 // Fail due to provided layout not matching actual current layout for color clear.
11916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011917 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011918 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011919
Cort530cf382016-12-08 09:59:47 -080011920 VkClearDepthStencilValue depth_clear_value = {};
11921 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011922
11923 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11924 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011927 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011928 m_errorMonitor->VerifyFound();
11929 // Fail due to provided layout not matching actual current layout for depth clear.
11930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011931 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011932 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011933
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011934 // Now cause error due to bad image layout transition in PipelineBarrier
11935 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011936 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011938 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011939 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011940 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11941 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011942 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011944 "you cannot transition the layout of aspect 1 from "
11945 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11946 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011948 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11949 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011950 m_errorMonitor->VerifyFound();
11951
11952 // Finally some layout errors at RenderPass create time
11953 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11954 VkAttachmentReference attach = {};
11955 // perf warning for GENERAL layout w/ non-DS input attachment
11956 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11957 VkSubpassDescription subpass = {};
11958 subpass.inputAttachmentCount = 1;
11959 subpass.pInputAttachments = &attach;
11960 VkRenderPassCreateInfo rpci = {};
11961 rpci.subpassCount = 1;
11962 rpci.pSubpasses = &subpass;
11963 rpci.attachmentCount = 1;
11964 VkAttachmentDescription attach_desc = {};
11965 attach_desc.format = VK_FORMAT_UNDEFINED;
11966 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011967 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011968 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11970 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011971 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11972 m_errorMonitor->VerifyFound();
11973 // error w/ non-general layout
11974 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11975
11976 m_errorMonitor->SetDesiredFailureMsg(
11977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11978 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11979 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11980 m_errorMonitor->VerifyFound();
11981 subpass.inputAttachmentCount = 0;
11982 subpass.colorAttachmentCount = 1;
11983 subpass.pColorAttachments = &attach;
11984 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11985 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11987 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011988 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11989 m_errorMonitor->VerifyFound();
11990 // error w/ non-color opt or GENERAL layout for color attachment
11991 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11992 m_errorMonitor->SetDesiredFailureMsg(
11993 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11994 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11995 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11996 m_errorMonitor->VerifyFound();
11997 subpass.colorAttachmentCount = 0;
11998 subpass.pDepthStencilAttachment = &attach;
11999 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12000 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12002 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012003 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12004 m_errorMonitor->VerifyFound();
12005 // error w/ non-ds opt or GENERAL layout for color attachment
12006 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12008 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12009 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012010 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12011 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012012 // For this error we need a valid renderpass so create default one
12013 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12014 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012015 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012016 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12017 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12018 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12019 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12020 // Can't do a CLEAR load on READ_ONLY initialLayout
12021 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12022 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12023 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012025 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012026 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12027 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012028
Cort3b021012016-12-07 12:00:57 -080012029 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12030 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12031 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012032 vkDestroyImage(m_device->device(), src_image, NULL);
12033 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012034 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012035}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012036
Tobin Ehlise0936662016-10-11 08:10:51 -060012037TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12038 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12039 VkResult err;
12040
Tony Barbour1fa09702017-03-16 12:09:08 -060012041 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012042
12043 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12044 VkImageTiling tiling;
12045 VkFormatProperties format_properties;
12046 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12047 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12048 tiling = VK_IMAGE_TILING_LINEAR;
12049 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12050 tiling = VK_IMAGE_TILING_OPTIMAL;
12051 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012052 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012053 return;
12054 }
12055
12056 VkDescriptorPoolSize ds_type = {};
12057 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12058 ds_type.descriptorCount = 1;
12059
12060 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12061 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12062 ds_pool_ci.maxSets = 1;
12063 ds_pool_ci.poolSizeCount = 1;
12064 ds_pool_ci.pPoolSizes = &ds_type;
12065 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12066
12067 VkDescriptorPool ds_pool;
12068 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12069 ASSERT_VK_SUCCESS(err);
12070
12071 VkDescriptorSetLayoutBinding dsl_binding = {};
12072 dsl_binding.binding = 0;
12073 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12074 dsl_binding.descriptorCount = 1;
12075 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12076 dsl_binding.pImmutableSamplers = NULL;
12077
12078 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12079 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12080 ds_layout_ci.pNext = NULL;
12081 ds_layout_ci.bindingCount = 1;
12082 ds_layout_ci.pBindings = &dsl_binding;
12083
12084 VkDescriptorSetLayout ds_layout;
12085 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12086 ASSERT_VK_SUCCESS(err);
12087
12088 VkDescriptorSetAllocateInfo alloc_info = {};
12089 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12090 alloc_info.descriptorSetCount = 1;
12091 alloc_info.descriptorPool = ds_pool;
12092 alloc_info.pSetLayouts = &ds_layout;
12093 VkDescriptorSet descriptor_set;
12094 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12095 ASSERT_VK_SUCCESS(err);
12096
12097 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12098 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12099 pipeline_layout_ci.pNext = NULL;
12100 pipeline_layout_ci.setLayoutCount = 1;
12101 pipeline_layout_ci.pSetLayouts = &ds_layout;
12102 VkPipelineLayout pipeline_layout;
12103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12104 ASSERT_VK_SUCCESS(err);
12105
12106 VkImageObj image(m_device);
12107 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12108 ASSERT_TRUE(image.initialized());
12109 VkImageView view = image.targetView(tex_format);
12110
12111 VkDescriptorImageInfo image_info = {};
12112 image_info.imageView = view;
12113 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12114
12115 VkWriteDescriptorSet descriptor_write = {};
12116 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12117 descriptor_write.dstSet = descriptor_set;
12118 descriptor_write.dstBinding = 0;
12119 descriptor_write.descriptorCount = 1;
12120 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12121 descriptor_write.pImageInfo = &image_info;
12122
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12124 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12125 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12126 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12127 m_errorMonitor->VerifyFound();
12128
12129 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12131 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12133}
12134
Mark Mueller93b938f2016-08-18 10:27:40 -060012135TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012136 TEST_DESCRIPTION(
12137 "Use vkCmdExecuteCommands with invalid state "
12138 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012139
Tony Barbour1fa09702017-03-16 12:09:08 -060012140 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12142
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012143 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012144 const char *simultaneous_use_message2 =
12145 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12146 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012147
12148 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012149 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012150 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012151 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12152 command_buffer_allocate_info.commandBufferCount = 1;
12153
12154 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012155 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012156 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12157 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012158 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012159 command_buffer_inheritance_info.renderPass = m_renderPass;
12160 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012161
Mark Mueller93b938f2016-08-18 10:27:40 -060012162 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012163 command_buffer_begin_info.flags =
12164 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012165 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12166
12167 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12168 vkEndCommandBuffer(secondary_command_buffer);
12169
Mark Mueller93b938f2016-08-18 10:27:40 -060012170 VkSubmitInfo submit_info = {};
12171 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12172 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012173 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012174
Mark Mueller4042b652016-09-05 22:52:21 -060012175 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012176 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12178 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012179 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012180 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012181 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12182 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012183
Dave Houltonfbf52152017-01-06 12:55:29 -070012184 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012185 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012186 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012187
Mark Mueller4042b652016-09-05 22:52:21 -060012188 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012189 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12190 m_errorMonitor->SetUnexpectedError(
12191 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12192 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012193 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012194 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012195
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12197 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012198 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012199 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12200 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012201
12202 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012203
12204 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012205}
12206
Tony Barbour626994c2017-02-08 15:29:37 -070012207TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12208 TEST_DESCRIPTION(
12209 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12210 "errors");
12211 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12212 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 -060012213 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012214
12215 VkCommandBuffer cmd_bufs[2];
12216 VkCommandBufferAllocateInfo alloc_info;
12217 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12218 alloc_info.pNext = NULL;
12219 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012220 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012221 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12222 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12223
12224 VkCommandBufferBeginInfo cb_binfo;
12225 cb_binfo.pNext = NULL;
12226 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12227 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12228 cb_binfo.flags = 0;
12229 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12231 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12232 vkEndCommandBuffer(cmd_bufs[0]);
12233 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12234
12235 VkSubmitInfo submit_info = {};
12236 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12237 submit_info.commandBufferCount = 2;
12238 submit_info.pCommandBuffers = duplicates;
12239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12240 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12241 m_errorMonitor->VerifyFound();
12242 vkQueueWaitIdle(m_device->m_queue);
12243
12244 // Set one time use and now look for one time submit
12245 duplicates[0] = duplicates[1] = cmd_bufs[1];
12246 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12247 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12248 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12249 vkEndCommandBuffer(cmd_bufs[1]);
12250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12251 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12252 m_errorMonitor->VerifyFound();
12253 vkQueueWaitIdle(m_device->m_queue);
12254}
12255
Tobin Ehlisb093da82017-01-19 12:05:27 -070012256TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012257 TEST_DESCRIPTION(
12258 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12259 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012260
Tony Barbour1fa09702017-03-16 12:09:08 -060012261 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12263
12264 std::vector<const char *> device_extension_names;
12265 auto features = m_device->phy().features();
12266 // Make sure gs & ts are disabled
12267 features.geometryShader = false;
12268 features.tessellationShader = false;
12269 // The sacrificial device object
12270 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12271
12272 VkCommandPoolCreateInfo pool_create_info{};
12273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12274 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12275
12276 VkCommandPool command_pool;
12277 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12278
12279 VkCommandBufferAllocateInfo cmd = {};
12280 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12281 cmd.pNext = NULL;
12282 cmd.commandPool = command_pool;
12283 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12284 cmd.commandBufferCount = 1;
12285
12286 VkCommandBuffer cmd_buffer;
12287 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12288 ASSERT_VK_SUCCESS(err);
12289
12290 VkEvent event;
12291 VkEventCreateInfo evci = {};
12292 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12293 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12294 ASSERT_VK_SUCCESS(result);
12295
12296 VkCommandBufferBeginInfo cbbi = {};
12297 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12298 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12300 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12301 m_errorMonitor->VerifyFound();
12302
12303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12304 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12305 m_errorMonitor->VerifyFound();
12306
12307 vkDestroyEvent(test_device.handle(), event, NULL);
12308 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12309}
12310
Mark Mueller917f6bc2016-08-30 10:57:19 -060012311TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012312 TEST_DESCRIPTION(
12313 "Use vkCmdExecuteCommands with invalid state "
12314 "in primary and secondary command buffers. "
12315 "Delete objects that are inuse. Call VkQueueSubmit "
12316 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012317
Tony Barbour1fa09702017-03-16 12:09:08 -060012318 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12320
Tony Barbour552f6c02016-12-21 14:34:07 -070012321 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012322
12323 VkEvent event;
12324 VkEventCreateInfo event_create_info = {};
12325 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12326 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012327 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012328
Tony Barbour552f6c02016-12-21 14:34:07 -070012329 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012330 vkDestroyEvent(m_device->device(), event, nullptr);
12331
12332 VkSubmitInfo submit_info = {};
12333 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12334 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012335 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012337 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12338 m_errorMonitor->VerifyFound();
12339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012340 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012341 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12342
12343 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12344
Mark Mueller917f6bc2016-08-30 10:57:19 -060012345 VkSemaphoreCreateInfo semaphore_create_info = {};
12346 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12347 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012348 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012349 VkFenceCreateInfo fence_create_info = {};
12350 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12351 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012353
12354 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012355 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012356 descriptor_pool_type_count.descriptorCount = 1;
12357
12358 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12359 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12360 descriptor_pool_create_info.maxSets = 1;
12361 descriptor_pool_create_info.poolSizeCount = 1;
12362 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012363 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012364
12365 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012367
12368 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012369 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012370 descriptorset_layout_binding.descriptorCount = 1;
12371 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12372
12373 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012375 descriptorset_layout_create_info.bindingCount = 1;
12376 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12377
12378 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 ASSERT_VK_SUCCESS(
12380 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012381
12382 VkDescriptorSet descriptorset;
12383 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012384 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012385 descriptorset_allocate_info.descriptorSetCount = 1;
12386 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12387 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012389
Mark Mueller4042b652016-09-05 22:52:21 -060012390 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12391
12392 VkDescriptorBufferInfo buffer_info = {};
12393 buffer_info.buffer = buffer_test.GetBuffer();
12394 buffer_info.offset = 0;
12395 buffer_info.range = 1024;
12396
12397 VkWriteDescriptorSet write_descriptor_set = {};
12398 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12399 write_descriptor_set.dstSet = descriptorset;
12400 write_descriptor_set.descriptorCount = 1;
12401 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12402 write_descriptor_set.pBufferInfo = &buffer_info;
12403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012405
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012406 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12407 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012408
12409 VkPipelineObj pipe(m_device);
12410 pipe.AddColorAttachment();
12411 pipe.AddShader(&vs);
12412 pipe.AddShader(&fs);
12413
12414 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012415 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012416 pipeline_layout_create_info.setLayoutCount = 1;
12417 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12418
12419 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012420 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012421
12422 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12423
Tony Barbour552f6c02016-12-21 14:34:07 -070012424 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012425 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012427 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12428 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12429 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012430
Tony Barbour552f6c02016-12-21 14:34:07 -070012431 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012432
Mark Mueller917f6bc2016-08-30 10:57:19 -060012433 submit_info.signalSemaphoreCount = 1;
12434 submit_info.pSignalSemaphores = &semaphore;
12435 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012436 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012437
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012439 vkDestroyEvent(m_device->device(), event, nullptr);
12440 m_errorMonitor->VerifyFound();
12441
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12444 m_errorMonitor->VerifyFound();
12445
Jeremy Hayes08369882017-02-02 10:31:06 -070012446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012447 vkDestroyFence(m_device->device(), fence, nullptr);
12448 m_errorMonitor->VerifyFound();
12449
Tobin Ehlis122207b2016-09-01 08:50:06 -070012450 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012451 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12452 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012453 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012454 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12455 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012456 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012457 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12458 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012459 vkDestroyEvent(m_device->device(), event, nullptr);
12460 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012461 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012462 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12463}
12464
Tobin Ehlis2adda372016-09-01 08:51:06 -070012465TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12466 TEST_DESCRIPTION("Delete in-use query pool.");
12467
Tony Barbour1fa09702017-03-16 12:09:08 -060012468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12470
12471 VkQueryPool query_pool;
12472 VkQueryPoolCreateInfo query_pool_ci{};
12473 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12474 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12475 query_pool_ci.queryCount = 1;
12476 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012477 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012478 // Reset query pool to create binding with cmd buffer
12479 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12480
Tony Barbour552f6c02016-12-21 14:34:07 -070012481 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482
12483 VkSubmitInfo submit_info = {};
12484 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12485 submit_info.commandBufferCount = 1;
12486 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12487 // Submit cmd buffer and then destroy query pool while in-flight
12488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12489
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012491 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12492 m_errorMonitor->VerifyFound();
12493
12494 vkQueueWaitIdle(m_device->m_queue);
12495 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012496 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12497 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012498 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12499}
12500
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012501TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12502 TEST_DESCRIPTION("Delete in-use pipeline.");
12503
Tony Barbour1fa09702017-03-16 12:09:08 -060012504 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12506
12507 // Empty pipeline layout used for binding PSO
12508 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12509 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12510 pipeline_layout_ci.setLayoutCount = 0;
12511 pipeline_layout_ci.pSetLayouts = NULL;
12512
12513 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012514 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012515 ASSERT_VK_SUCCESS(err);
12516
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012519 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12520 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521 // Store pipeline handle so we can actually delete it before test finishes
12522 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012523 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012524 VkPipelineObj pipe(m_device);
12525 pipe.AddShader(&vs);
12526 pipe.AddShader(&fs);
12527 pipe.AddColorAttachment();
12528 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12529 delete_this_pipeline = pipe.handle();
12530
Tony Barbour552f6c02016-12-21 14:34:07 -070012531 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012532 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012533 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012534
Tony Barbour552f6c02016-12-21 14:34:07 -070012535 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012536
12537 VkSubmitInfo submit_info = {};
12538 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12539 submit_info.commandBufferCount = 1;
12540 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12541 // Submit cmd buffer and then pipeline destroyed while in-flight
12542 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012543 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012544 m_errorMonitor->VerifyFound();
12545 // Make sure queue finished and then actually delete pipeline
12546 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012547 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12548 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012549 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12550 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12551}
12552
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012553TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12554 TEST_DESCRIPTION("Delete in-use imageView.");
12555
Tony Barbour1fa09702017-03-16 12:09:08 -060012556 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12558
12559 VkDescriptorPoolSize ds_type_count;
12560 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12561 ds_type_count.descriptorCount = 1;
12562
12563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12565 ds_pool_ci.maxSets = 1;
12566 ds_pool_ci.poolSizeCount = 1;
12567 ds_pool_ci.pPoolSizes = &ds_type_count;
12568
12569 VkDescriptorPool ds_pool;
12570 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12571 ASSERT_VK_SUCCESS(err);
12572
12573 VkSamplerCreateInfo sampler_ci = {};
12574 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12575 sampler_ci.pNext = NULL;
12576 sampler_ci.magFilter = VK_FILTER_NEAREST;
12577 sampler_ci.minFilter = VK_FILTER_NEAREST;
12578 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12579 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12580 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12581 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12582 sampler_ci.mipLodBias = 1.0;
12583 sampler_ci.anisotropyEnable = VK_FALSE;
12584 sampler_ci.maxAnisotropy = 1;
12585 sampler_ci.compareEnable = VK_FALSE;
12586 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12587 sampler_ci.minLod = 1.0;
12588 sampler_ci.maxLod = 1.0;
12589 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12590 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12591 VkSampler sampler;
12592
12593 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12594 ASSERT_VK_SUCCESS(err);
12595
12596 VkDescriptorSetLayoutBinding layout_binding;
12597 layout_binding.binding = 0;
12598 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12599 layout_binding.descriptorCount = 1;
12600 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12601 layout_binding.pImmutableSamplers = NULL;
12602
12603 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12604 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12605 ds_layout_ci.bindingCount = 1;
12606 ds_layout_ci.pBindings = &layout_binding;
12607 VkDescriptorSetLayout ds_layout;
12608 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12609 ASSERT_VK_SUCCESS(err);
12610
12611 VkDescriptorSetAllocateInfo alloc_info = {};
12612 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12613 alloc_info.descriptorSetCount = 1;
12614 alloc_info.descriptorPool = ds_pool;
12615 alloc_info.pSetLayouts = &ds_layout;
12616 VkDescriptorSet descriptor_set;
12617 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12618 ASSERT_VK_SUCCESS(err);
12619
12620 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12621 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12622 pipeline_layout_ci.pNext = NULL;
12623 pipeline_layout_ci.setLayoutCount = 1;
12624 pipeline_layout_ci.pSetLayouts = &ds_layout;
12625
12626 VkPipelineLayout pipeline_layout;
12627 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12628 ASSERT_VK_SUCCESS(err);
12629
12630 VkImageObj image(m_device);
12631 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12632 ASSERT_TRUE(image.initialized());
12633
12634 VkImageView view;
12635 VkImageViewCreateInfo ivci = {};
12636 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12637 ivci.image = image.handle();
12638 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12639 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12640 ivci.subresourceRange.layerCount = 1;
12641 ivci.subresourceRange.baseMipLevel = 0;
12642 ivci.subresourceRange.levelCount = 1;
12643 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12644
12645 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12646 ASSERT_VK_SUCCESS(err);
12647
12648 VkDescriptorImageInfo image_info{};
12649 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12650 image_info.imageView = view;
12651 image_info.sampler = sampler;
12652
12653 VkWriteDescriptorSet descriptor_write = {};
12654 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12655 descriptor_write.dstSet = descriptor_set;
12656 descriptor_write.dstBinding = 0;
12657 descriptor_write.descriptorCount = 1;
12658 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12659 descriptor_write.pImageInfo = &image_info;
12660
12661 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12662
12663 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012664 char const *vsSource =
12665 "#version 450\n"
12666 "\n"
12667 "out gl_PerVertex { \n"
12668 " vec4 gl_Position;\n"
12669 "};\n"
12670 "void main(){\n"
12671 " gl_Position = vec4(1);\n"
12672 "}\n";
12673 char const *fsSource =
12674 "#version 450\n"
12675 "\n"
12676 "layout(set=0, binding=0) uniform sampler2D s;\n"
12677 "layout(location=0) out vec4 x;\n"
12678 "void main(){\n"
12679 " x = texture(s, vec2(1));\n"
12680 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12683 VkPipelineObj pipe(m_device);
12684 pipe.AddShader(&vs);
12685 pipe.AddShader(&fs);
12686 pipe.AddColorAttachment();
12687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12688
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->BeginCommandBuffer();
12692 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012693 // Bind pipeline to cmd buffer
12694 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12695 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12696 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012697
12698 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12699 VkRect2D scissor = {{0, 0}, {16, 16}};
12700 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12701 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12702
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012703 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012704 m_commandBuffer->EndRenderPass();
12705 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012706 // Submit cmd buffer then destroy sampler
12707 VkSubmitInfo submit_info = {};
12708 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12709 submit_info.commandBufferCount = 1;
12710 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12711 // Submit cmd buffer and then destroy imageView while in-flight
12712 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12713
12714 vkDestroyImageView(m_device->device(), view, nullptr);
12715 m_errorMonitor->VerifyFound();
12716 vkQueueWaitIdle(m_device->m_queue);
12717 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012718 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12719 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012720 vkDestroyImageView(m_device->device(), view, NULL);
12721 vkDestroySampler(m_device->device(), sampler, nullptr);
12722 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12723 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12724 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12725}
12726
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012727TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12728 TEST_DESCRIPTION("Delete in-use bufferView.");
12729
Tony Barbour1fa09702017-03-16 12:09:08 -060012730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12732
12733 VkDescriptorPoolSize ds_type_count;
12734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12735 ds_type_count.descriptorCount = 1;
12736
12737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12739 ds_pool_ci.maxSets = 1;
12740 ds_pool_ci.poolSizeCount = 1;
12741 ds_pool_ci.pPoolSizes = &ds_type_count;
12742
12743 VkDescriptorPool ds_pool;
12744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12745 ASSERT_VK_SUCCESS(err);
12746
12747 VkDescriptorSetLayoutBinding layout_binding;
12748 layout_binding.binding = 0;
12749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12750 layout_binding.descriptorCount = 1;
12751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12752 layout_binding.pImmutableSamplers = NULL;
12753
12754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12756 ds_layout_ci.bindingCount = 1;
12757 ds_layout_ci.pBindings = &layout_binding;
12758 VkDescriptorSetLayout ds_layout;
12759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12760 ASSERT_VK_SUCCESS(err);
12761
12762 VkDescriptorSetAllocateInfo alloc_info = {};
12763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12764 alloc_info.descriptorSetCount = 1;
12765 alloc_info.descriptorPool = ds_pool;
12766 alloc_info.pSetLayouts = &ds_layout;
12767 VkDescriptorSet descriptor_set;
12768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12769 ASSERT_VK_SUCCESS(err);
12770
12771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12773 pipeline_layout_ci.pNext = NULL;
12774 pipeline_layout_ci.setLayoutCount = 1;
12775 pipeline_layout_ci.pSetLayouts = &ds_layout;
12776
12777 VkPipelineLayout pipeline_layout;
12778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12779 ASSERT_VK_SUCCESS(err);
12780
12781 VkBuffer buffer;
12782 uint32_t queue_family_index = 0;
12783 VkBufferCreateInfo buffer_create_info = {};
12784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12785 buffer_create_info.size = 1024;
12786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12787 buffer_create_info.queueFamilyIndexCount = 1;
12788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12789
12790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12791 ASSERT_VK_SUCCESS(err);
12792
12793 VkMemoryRequirements memory_reqs;
12794 VkDeviceMemory buffer_memory;
12795
12796 VkMemoryAllocateInfo memory_info = {};
12797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12798 memory_info.allocationSize = 0;
12799 memory_info.memoryTypeIndex = 0;
12800
12801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12802 memory_info.allocationSize = memory_reqs.size;
12803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12804 ASSERT_TRUE(pass);
12805
12806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12807 ASSERT_VK_SUCCESS(err);
12808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12809 ASSERT_VK_SUCCESS(err);
12810
12811 VkBufferView view;
12812 VkBufferViewCreateInfo bvci = {};
12813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12814 bvci.buffer = buffer;
12815 bvci.format = VK_FORMAT_R8_UNORM;
12816 bvci.range = VK_WHOLE_SIZE;
12817
12818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12819 ASSERT_VK_SUCCESS(err);
12820
12821 VkWriteDescriptorSet descriptor_write = {};
12822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12823 descriptor_write.dstSet = descriptor_set;
12824 descriptor_write.dstBinding = 0;
12825 descriptor_write.descriptorCount = 1;
12826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12827 descriptor_write.pTexelBufferView = &view;
12828
12829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012831 char const *vsSource =
12832 "#version 450\n"
12833 "\n"
12834 "out gl_PerVertex { \n"
12835 " vec4 gl_Position;\n"
12836 "};\n"
12837 "void main(){\n"
12838 " gl_Position = vec4(1);\n"
12839 "}\n";
12840 char const *fsSource =
12841 "#version 450\n"
12842 "\n"
12843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12844 "layout(location=0) out vec4 x;\n"
12845 "void main(){\n"
12846 " x = imageLoad(s, 0);\n"
12847 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12850 VkPipelineObj pipe(m_device);
12851 pipe.AddShader(&vs);
12852 pipe.AddShader(&fs);
12853 pipe.AddColorAttachment();
12854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12855
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012857
Tony Barbour552f6c02016-12-21 14:34:07 -070012858 m_commandBuffer->BeginCommandBuffer();
12859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012860 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12861 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12862 VkRect2D scissor = {{0, 0}, {16, 16}};
12863 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12864 // Bind pipeline to cmd buffer
12865 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12866 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12867 &descriptor_set, 0, nullptr);
12868 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012869 m_commandBuffer->EndRenderPass();
12870 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012871
12872 VkSubmitInfo submit_info = {};
12873 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12874 submit_info.commandBufferCount = 1;
12875 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12876 // Submit cmd buffer and then destroy bufferView while in-flight
12877 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12878
12879 vkDestroyBufferView(m_device->device(), view, nullptr);
12880 m_errorMonitor->VerifyFound();
12881 vkQueueWaitIdle(m_device->m_queue);
12882 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012883 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12884 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012885 vkDestroyBufferView(m_device->device(), view, NULL);
12886 vkDestroyBuffer(m_device->device(), buffer, NULL);
12887 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12888 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12889 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12890 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12891}
12892
Tobin Ehlis209532e2016-09-07 13:52:18 -060012893TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12894 TEST_DESCRIPTION("Delete in-use sampler.");
12895
Tony Barbour1fa09702017-03-16 12:09:08 -060012896 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12898
12899 VkDescriptorPoolSize ds_type_count;
12900 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12901 ds_type_count.descriptorCount = 1;
12902
12903 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12904 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12905 ds_pool_ci.maxSets = 1;
12906 ds_pool_ci.poolSizeCount = 1;
12907 ds_pool_ci.pPoolSizes = &ds_type_count;
12908
12909 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012910 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012911 ASSERT_VK_SUCCESS(err);
12912
12913 VkSamplerCreateInfo sampler_ci = {};
12914 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12915 sampler_ci.pNext = NULL;
12916 sampler_ci.magFilter = VK_FILTER_NEAREST;
12917 sampler_ci.minFilter = VK_FILTER_NEAREST;
12918 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12919 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12920 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12921 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12922 sampler_ci.mipLodBias = 1.0;
12923 sampler_ci.anisotropyEnable = VK_FALSE;
12924 sampler_ci.maxAnisotropy = 1;
12925 sampler_ci.compareEnable = VK_FALSE;
12926 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12927 sampler_ci.minLod = 1.0;
12928 sampler_ci.maxLod = 1.0;
12929 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12930 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12931 VkSampler sampler;
12932
12933 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12934 ASSERT_VK_SUCCESS(err);
12935
12936 VkDescriptorSetLayoutBinding layout_binding;
12937 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012938 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012939 layout_binding.descriptorCount = 1;
12940 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12941 layout_binding.pImmutableSamplers = NULL;
12942
12943 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12944 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12945 ds_layout_ci.bindingCount = 1;
12946 ds_layout_ci.pBindings = &layout_binding;
12947 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012948 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012949 ASSERT_VK_SUCCESS(err);
12950
12951 VkDescriptorSetAllocateInfo alloc_info = {};
12952 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12953 alloc_info.descriptorSetCount = 1;
12954 alloc_info.descriptorPool = ds_pool;
12955 alloc_info.pSetLayouts = &ds_layout;
12956 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012957 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012958 ASSERT_VK_SUCCESS(err);
12959
12960 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12961 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12962 pipeline_layout_ci.pNext = NULL;
12963 pipeline_layout_ci.setLayoutCount = 1;
12964 pipeline_layout_ci.pSetLayouts = &ds_layout;
12965
12966 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012967 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012968 ASSERT_VK_SUCCESS(err);
12969
12970 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012971 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 -060012972 ASSERT_TRUE(image.initialized());
12973
12974 VkImageView view;
12975 VkImageViewCreateInfo ivci = {};
12976 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12977 ivci.image = image.handle();
12978 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12979 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12980 ivci.subresourceRange.layerCount = 1;
12981 ivci.subresourceRange.baseMipLevel = 0;
12982 ivci.subresourceRange.levelCount = 1;
12983 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12984
12985 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12986 ASSERT_VK_SUCCESS(err);
12987
12988 VkDescriptorImageInfo image_info{};
12989 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12990 image_info.imageView = view;
12991 image_info.sampler = sampler;
12992
12993 VkWriteDescriptorSet descriptor_write = {};
12994 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12995 descriptor_write.dstSet = descriptor_set;
12996 descriptor_write.dstBinding = 0;
12997 descriptor_write.descriptorCount = 1;
12998 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12999 descriptor_write.pImageInfo = &image_info;
13000
13001 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13002
13003 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013004 char const *vsSource =
13005 "#version 450\n"
13006 "\n"
13007 "out gl_PerVertex { \n"
13008 " vec4 gl_Position;\n"
13009 "};\n"
13010 "void main(){\n"
13011 " gl_Position = vec4(1);\n"
13012 "}\n";
13013 char const *fsSource =
13014 "#version 450\n"
13015 "\n"
13016 "layout(set=0, binding=0) uniform sampler2D s;\n"
13017 "layout(location=0) out vec4 x;\n"
13018 "void main(){\n"
13019 " x = texture(s, vec2(1));\n"
13020 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013021 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13022 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13023 VkPipelineObj pipe(m_device);
13024 pipe.AddShader(&vs);
13025 pipe.AddShader(&fs);
13026 pipe.AddColorAttachment();
13027 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13028
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030
Tony Barbour552f6c02016-12-21 14:34:07 -070013031 m_commandBuffer->BeginCommandBuffer();
13032 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013033 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13035 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13036 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013037
13038 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13039 VkRect2D scissor = {{0, 0}, {16, 16}};
13040 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13041 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13042
Tobin Ehlis209532e2016-09-07 13:52:18 -060013043 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013044 m_commandBuffer->EndRenderPass();
13045 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 // Submit cmd buffer then destroy sampler
13047 VkSubmitInfo submit_info = {};
13048 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13049 submit_info.commandBufferCount = 1;
13050 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13051 // Submit cmd buffer and then destroy sampler while in-flight
13052 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13053
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013054 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013055 m_errorMonitor->VerifyFound();
13056 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013057
Tobin Ehlis209532e2016-09-07 13:52:18 -060013058 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013059 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13060 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013061 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013062 vkDestroyImageView(m_device->device(), view, NULL);
13063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13066}
13067
Mark Mueller1cd9f412016-08-25 13:23:52 -060013068TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013069 TEST_DESCRIPTION(
13070 "Call VkQueueSubmit with a semaphore that is already "
13071 "signaled but not waited on by the queue. Wait on a "
13072 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013073
Tony Barbour1fa09702017-03-16 12:09:08 -060013074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13076
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013077 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 -070013078 const char *invalid_fence_wait_message =
13079 " which has not been submitted on a Queue or during "
13080 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013081
Tony Barbour552f6c02016-12-21 14:34:07 -070013082 m_commandBuffer->BeginCommandBuffer();
13083 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013084
13085 VkSemaphoreCreateInfo semaphore_create_info = {};
13086 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13087 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013089 VkSubmitInfo submit_info = {};
13090 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13091 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013092 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013093 submit_info.signalSemaphoreCount = 1;
13094 submit_info.pSignalSemaphores = &semaphore;
13095 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013096 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013097 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013098 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013099 m_commandBuffer->BeginCommandBuffer();
13100 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013102 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13103 m_errorMonitor->VerifyFound();
13104
Mark Mueller1cd9f412016-08-25 13:23:52 -060013105 VkFenceCreateInfo fence_create_info = {};
13106 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13107 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013108 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013111 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13112 m_errorMonitor->VerifyFound();
13113
Mark Mueller4042b652016-09-05 22:52:21 -060013114 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013115 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013116 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13117}
13118
Tobin Ehlis4af23302016-07-19 10:50:30 -060013119TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013120 TEST_DESCRIPTION(
13121 "Bind a secondary command buffer with with a framebuffer "
13122 "that does not match the framebuffer for the active "
13123 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013124 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13126
13127 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013128 VkAttachmentDescription attachment = {0,
13129 VK_FORMAT_B8G8R8A8_UNORM,
13130 VK_SAMPLE_COUNT_1_BIT,
13131 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13132 VK_ATTACHMENT_STORE_OP_STORE,
13133 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13134 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13135 VK_IMAGE_LAYOUT_UNDEFINED,
13136 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013140 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013141
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013142 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013143
13144 VkRenderPass rp;
13145 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13146 ASSERT_VK_SUCCESS(err);
13147
13148 // A compatible framebuffer.
13149 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013150 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 -060013151 ASSERT_TRUE(image.initialized());
13152
13153 VkImageViewCreateInfo ivci = {
13154 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13155 nullptr,
13156 0,
13157 image.handle(),
13158 VK_IMAGE_VIEW_TYPE_2D,
13159 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013160 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13161 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013162 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13163 };
13164 VkImageView view;
13165 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13166 ASSERT_VK_SUCCESS(err);
13167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013168 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013169 VkFramebuffer fb;
13170 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13171 ASSERT_VK_SUCCESS(err);
13172
13173 VkCommandBufferAllocateInfo cbai = {};
13174 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013175 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013176 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13177 cbai.commandBufferCount = 1;
13178
13179 VkCommandBuffer sec_cb;
13180 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13181 ASSERT_VK_SUCCESS(err);
13182 VkCommandBufferBeginInfo cbbi = {};
13183 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013184 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013185 cbii.renderPass = renderPass();
13186 cbii.framebuffer = fb;
13187 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13188 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013189 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 -060013190 cbbi.pInheritanceInfo = &cbii;
13191 vkBeginCommandBuffer(sec_cb, &cbbi);
13192 vkEndCommandBuffer(sec_cb);
13193
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013194 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013195 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13196 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013199 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013200 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13201 m_errorMonitor->VerifyFound();
13202 // Cleanup
13203 vkDestroyImageView(m_device->device(), view, NULL);
13204 vkDestroyRenderPass(m_device->device(), rp, NULL);
13205 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13206}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013207
13208TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013209 TEST_DESCRIPTION(
13210 "If logicOp is available on the device, set it to an "
13211 "invalid value. If logicOp is not available, attempt to "
13212 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13215
13216 auto features = m_device->phy().features();
13217 // Set the expected error depending on whether or not logicOp available
13218 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13220 "If logic operations feature not "
13221 "enabled, logicOpEnable must be "
13222 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013223 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013225 }
13226 // Create a pipeline using logicOp
13227 VkResult err;
13228
13229 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13230 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13231
13232 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013233 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013234 ASSERT_VK_SUCCESS(err);
13235
13236 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13237 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13238 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013239 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013240 vp_state_ci.pViewports = &vp;
13241 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013242 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013243 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013244
13245 VkPipelineShaderStageCreateInfo shaderStages[2];
13246 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13247
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013248 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13249 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013250 shaderStages[0] = vs.GetStageCreateInfo();
13251 shaderStages[1] = fs.GetStageCreateInfo();
13252
13253 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13254 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13255
13256 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13257 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13258 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13259
13260 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13261 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013262 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013263
13264 VkPipelineColorBlendAttachmentState att = {};
13265 att.blendEnable = VK_FALSE;
13266 att.colorWriteMask = 0xf;
13267
13268 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13269 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13270 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13271 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013272 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013273 cb_ci.attachmentCount = 1;
13274 cb_ci.pAttachments = &att;
13275
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013276 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13277 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13278 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13279
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013280 VkGraphicsPipelineCreateInfo gp_ci = {};
13281 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13282 gp_ci.stageCount = 2;
13283 gp_ci.pStages = shaderStages;
13284 gp_ci.pVertexInputState = &vi_ci;
13285 gp_ci.pInputAssemblyState = &ia_ci;
13286 gp_ci.pViewportState = &vp_state_ci;
13287 gp_ci.pRasterizationState = &rs_ci;
13288 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013289 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13291 gp_ci.layout = pipeline_layout;
13292 gp_ci.renderPass = renderPass();
13293
13294 VkPipelineCacheCreateInfo pc_ci = {};
13295 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13296
13297 VkPipeline pipeline;
13298 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013299 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013300 ASSERT_VK_SUCCESS(err);
13301
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013303 m_errorMonitor->VerifyFound();
13304 if (VK_SUCCESS == err) {
13305 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13306 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013307 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13308 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13309}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013310
Mike Stroyanaccf7692015-05-12 16:00:45 -060013311#if GTEST_IS_THREADSAFE
13312struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013313 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013314 VkEvent event;
13315 bool bailout;
13316};
13317
Karl Schultz6addd812016-02-02 17:17:23 -070013318extern "C" void *AddToCommandBuffer(void *arg) {
13319 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013320
Mike Stroyana6d14942016-07-13 15:10:05 -060013321 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013322 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013323 if (data->bailout) {
13324 break;
13325 }
13326 }
13327 return NULL;
13328}
13329
Karl Schultz6addd812016-02-02 17:17:23 -070013330TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013331 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013334
Tony Barbour1fa09702017-03-16 12:09:08 -060013335 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013336 ASSERT_NO_FATAL_FAILURE(InitViewport());
13337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13338
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013339 // Calls AllocateCommandBuffers
13340 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013341
13342 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013343 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013344
13345 VkEventCreateInfo event_info;
13346 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013347 VkResult err;
13348
13349 memset(&event_info, 0, sizeof(event_info));
13350 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13351
Chia-I Wuf7458c52015-10-26 21:10:41 +080013352 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013353 ASSERT_VK_SUCCESS(err);
13354
Mike Stroyanaccf7692015-05-12 16:00:45 -060013355 err = vkResetEvent(device(), event);
13356 ASSERT_VK_SUCCESS(err);
13357
13358 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013359 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013360 data.event = event;
13361 data.bailout = false;
13362 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013363
13364 // First do some correct operations using multiple threads.
13365 // Add many entries to command buffer from another thread.
13366 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13367 // Make non-conflicting calls from this thread at the same time.
13368 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013369 uint32_t count;
13370 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013371 }
13372 test_platform_thread_join(thread, NULL);
13373
13374 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013375 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013376 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013377 // Add many entries to command buffer from this thread at the same time.
13378 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013379
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013380 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013381 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013382
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013383 m_errorMonitor->SetBailout(NULL);
13384
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013385 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013386
Chia-I Wuf7458c52015-10-26 21:10:41 +080013387 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013388}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013389#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013390
Karl Schultz6addd812016-02-02 17:17:23 -070013391TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013392 TEST_DESCRIPTION(
13393 "Test that an error is produced for a spirv module "
13394 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013397
Tony Barbour1fa09702017-03-16 12:09:08 -060013398 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13400
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013401 VkShaderModule module;
13402 VkShaderModuleCreateInfo moduleCreateInfo;
13403 struct icd_spv_header spv;
13404
13405 spv.magic = ICD_SPV_MAGIC;
13406 spv.version = ICD_SPV_VERSION;
13407 spv.gen_magic = 0;
13408
13409 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13410 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013411 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013412 moduleCreateInfo.codeSize = 4;
13413 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013414 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013415
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013416 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013417}
13418
Karl Schultz6addd812016-02-02 17:17:23 -070013419TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013420 TEST_DESCRIPTION(
13421 "Test that an error is produced for a spirv module "
13422 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013423
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013425
Tony Barbour1fa09702017-03-16 12:09:08 -060013426 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13428
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013429 VkShaderModule module;
13430 VkShaderModuleCreateInfo moduleCreateInfo;
13431 struct icd_spv_header spv;
13432
13433 spv.magic = ~ICD_SPV_MAGIC;
13434 spv.version = ICD_SPV_VERSION;
13435 spv.gen_magic = 0;
13436
13437 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13438 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013439 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013440 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13441 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013442 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013444 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013445}
13446
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013447#if 0
13448// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013449TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013451 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013452
Tony Barbour1fa09702017-03-16 12:09:08 -060013453 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13455
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013456 VkShaderModule module;
13457 VkShaderModuleCreateInfo moduleCreateInfo;
13458 struct icd_spv_header spv;
13459
13460 spv.magic = ICD_SPV_MAGIC;
13461 spv.version = ~ICD_SPV_VERSION;
13462 spv.gen_magic = 0;
13463
13464 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13465 moduleCreateInfo.pNext = NULL;
13466
Karl Schultz6addd812016-02-02 17:17:23 -070013467 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013468 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13469 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013470 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013471
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013472 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013473}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013474#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013475
Karl Schultz6addd812016-02-02 17:17:23 -070013476TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013477 TEST_DESCRIPTION(
13478 "Test that a warning is produced for a vertex output that "
13479 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013481
Tony Barbour1fa09702017-03-16 12:09:08 -060013482 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013484
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013485 char const *vsSource =
13486 "#version 450\n"
13487 "\n"
13488 "layout(location=0) out float x;\n"
13489 "out gl_PerVertex {\n"
13490 " vec4 gl_Position;\n"
13491 "};\n"
13492 "void main(){\n"
13493 " gl_Position = vec4(1);\n"
13494 " x = 0;\n"
13495 "}\n";
13496 char const *fsSource =
13497 "#version 450\n"
13498 "\n"
13499 "layout(location=0) out vec4 color;\n"
13500 "void main(){\n"
13501 " color = vec4(1);\n"
13502 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013504 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13505 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013506
13507 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013508 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013509 pipe.AddShader(&vs);
13510 pipe.AddShader(&fs);
13511
Chris Forbes9f7ff632015-05-25 11:13:08 +120013512 VkDescriptorSetObj descriptorSet(m_device);
13513 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013514 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013515
Tony Barbour5781e8f2015-08-04 16:23:11 -060013516 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013517
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013518 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013519}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013520
Mark Mueller098c9cb2016-09-08 09:01:57 -060013521TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13522 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13523
Tony Barbour1fa09702017-03-16 12:09:08 -060013524 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13526
13527 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013528 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013530 char const *vsSource =
13531 "#version 450\n"
13532 "\n"
13533 "out gl_PerVertex {\n"
13534 " vec4 gl_Position;\n"
13535 "};\n"
13536 "void main(){\n"
13537 " gl_Position = vec4(1);\n"
13538 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013539
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013540 char const *fsSource =
13541 "#version 450\n"
13542 "\n"
13543 "layout (constant_id = 0) const float r = 0.0f;\n"
13544 "layout(location = 0) out vec4 uFragColor;\n"
13545 "void main(){\n"
13546 " uFragColor = vec4(r,1,0,1);\n"
13547 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013548
13549 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13550 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13551
13552 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13553 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13554
13555 VkPipelineLayout pipeline_layout;
13556 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13557
13558 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13559 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13560 vp_state_create_info.viewportCount = 1;
13561 VkViewport viewport = {};
13562 vp_state_create_info.pViewports = &viewport;
13563 vp_state_create_info.scissorCount = 1;
13564 VkRect2D scissors = {};
13565 vp_state_create_info.pScissors = &scissors;
13566
13567 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13568
13569 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13570 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13571 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13572 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13573
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013574 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013575
13576 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13577 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13578
13579 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13580 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13581 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13582
13583 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13584 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13585 rasterization_state_create_info.pNext = nullptr;
13586 rasterization_state_create_info.lineWidth = 1.0f;
13587 rasterization_state_create_info.rasterizerDiscardEnable = true;
13588
13589 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13590 color_blend_attachment_state.blendEnable = VK_FALSE;
13591 color_blend_attachment_state.colorWriteMask = 0xf;
13592
13593 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13594 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13595 color_blend_state_create_info.attachmentCount = 1;
13596 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13597
13598 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13599 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13600 graphicspipe_create_info.stageCount = 2;
13601 graphicspipe_create_info.pStages = shader_stage_create_info;
13602 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13603 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13604 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13605 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13606 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13607 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13608 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13609 graphicspipe_create_info.layout = pipeline_layout;
13610 graphicspipe_create_info.renderPass = renderPass();
13611
13612 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13613 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13614
13615 VkPipelineCache pipelineCache;
13616 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13617
13618 // This structure maps constant ids to data locations.
13619 const VkSpecializationMapEntry entry =
13620 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013621 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013622
13623 uint32_t data = 1;
13624
13625 // Set up the info describing spec map and data
13626 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013627 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013628 };
13629 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13630
13631 VkPipeline pipeline;
13632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13633 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13634 m_errorMonitor->VerifyFound();
13635
13636 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13638}
13639
13640TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13641 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13642
Tony Barbour1fa09702017-03-16 12:09:08 -060013643 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013644 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13645
13646 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13647
13648 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13649 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13650 descriptor_pool_type_count[0].descriptorCount = 1;
13651 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13652 descriptor_pool_type_count[1].descriptorCount = 1;
13653
13654 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13655 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13656 descriptor_pool_create_info.maxSets = 1;
13657 descriptor_pool_create_info.poolSizeCount = 2;
13658 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13659 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13660
13661 VkDescriptorPool descriptorset_pool;
13662 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13663
13664 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13665 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13666 descriptorset_layout_binding.descriptorCount = 1;
13667 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013668 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013669
13670 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13671 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13672 descriptorset_layout_create_info.bindingCount = 1;
13673 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13674
13675 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013676 ASSERT_VK_SUCCESS(
13677 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013678
13679 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13680 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13681 descriptorset_allocate_info.descriptorSetCount = 1;
13682 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13683 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13684 VkDescriptorSet descriptorset;
13685 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13686
13687 // Challenge core_validation with a non uniform buffer type.
13688 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013690 char const *vsSource =
13691 "#version 450\n"
13692 "\n"
13693 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13694 " mat4 mvp;\n"
13695 "} ubuf;\n"
13696 "out gl_PerVertex {\n"
13697 " vec4 gl_Position;\n"
13698 "};\n"
13699 "void main(){\n"
13700 " gl_Position = ubuf.mvp * vec4(1);\n"
13701 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013702
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013703 char const *fsSource =
13704 "#version 450\n"
13705 "\n"
13706 "layout(location = 0) out vec4 uFragColor;\n"
13707 "void main(){\n"
13708 " uFragColor = vec4(0,1,0,1);\n"
13709 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013710
13711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13713
13714 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13715 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13716 pipeline_layout_create_info.setLayoutCount = 1;
13717 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13718
13719 VkPipelineLayout pipeline_layout;
13720 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13721
13722 VkPipelineObj pipe(m_device);
13723 pipe.AddColorAttachment();
13724 pipe.AddShader(&vs);
13725 pipe.AddShader(&fs);
13726
13727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13728 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13729 m_errorMonitor->VerifyFound();
13730
13731 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13732 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13733 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13734}
13735
13736TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13737 TEST_DESCRIPTION(
13738 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13739
Tony Barbour1fa09702017-03-16 12:09:08 -060013740 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13742
13743 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13744
13745 VkDescriptorPoolSize descriptor_pool_type_count = {};
13746 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13747 descriptor_pool_type_count.descriptorCount = 1;
13748
13749 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13750 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13751 descriptor_pool_create_info.maxSets = 1;
13752 descriptor_pool_create_info.poolSizeCount = 1;
13753 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13754 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13755
13756 VkDescriptorPool descriptorset_pool;
13757 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13758
13759 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13760 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13761 descriptorset_layout_binding.descriptorCount = 1;
13762 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13763 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013764 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013765
13766 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13767 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13768 descriptorset_layout_create_info.bindingCount = 1;
13769 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13770
13771 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013772 ASSERT_VK_SUCCESS(
13773 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013774
13775 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13776 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13777 descriptorset_allocate_info.descriptorSetCount = 1;
13778 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13779 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13780 VkDescriptorSet descriptorset;
13781 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13782
13783 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13784
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013785 char const *vsSource =
13786 "#version 450\n"
13787 "\n"
13788 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13789 " mat4 mvp;\n"
13790 "} ubuf;\n"
13791 "out gl_PerVertex {\n"
13792 " vec4 gl_Position;\n"
13793 "};\n"
13794 "void main(){\n"
13795 " gl_Position = ubuf.mvp * vec4(1);\n"
13796 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013797
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013798 char const *fsSource =
13799 "#version 450\n"
13800 "\n"
13801 "layout(location = 0) out vec4 uFragColor;\n"
13802 "void main(){\n"
13803 " uFragColor = vec4(0,1,0,1);\n"
13804 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013805
13806 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13807 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13808
13809 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13810 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13811 pipeline_layout_create_info.setLayoutCount = 1;
13812 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13813
13814 VkPipelineLayout pipeline_layout;
13815 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13816
13817 VkPipelineObj pipe(m_device);
13818 pipe.AddColorAttachment();
13819 pipe.AddShader(&vs);
13820 pipe.AddShader(&fs);
13821
13822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13823 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13824 m_errorMonitor->VerifyFound();
13825
13826 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13827 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13828 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13829}
13830
13831TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013832 TEST_DESCRIPTION(
13833 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13834 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013835
Tony Barbour1fa09702017-03-16 12:09:08 -060013836 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13838
13839 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013840 "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 -060013841
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013842 char const *vsSource =
13843 "#version 450\n"
13844 "\n"
13845 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13846 "out gl_PerVertex {\n"
13847 " vec4 gl_Position;\n"
13848 "};\n"
13849 "void main(){\n"
13850 " gl_Position = vec4(consts.x);\n"
13851 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013853 char const *fsSource =
13854 "#version 450\n"
13855 "\n"
13856 "layout(location = 0) out vec4 uFragColor;\n"
13857 "void main(){\n"
13858 " uFragColor = vec4(0,1,0,1);\n"
13859 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013860
13861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13863
13864 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13865 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13866
13867 // Set up a push constant range
13868 VkPushConstantRange push_constant_ranges = {};
13869 // Set to the wrong stage to challenge core_validation
13870 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13871 push_constant_ranges.size = 4;
13872
13873 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13874 pipeline_layout_create_info.pushConstantRangeCount = 1;
13875
13876 VkPipelineLayout pipeline_layout;
13877 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13878
13879 VkPipelineObj pipe(m_device);
13880 pipe.AddColorAttachment();
13881 pipe.AddShader(&vs);
13882 pipe.AddShader(&fs);
13883
13884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13885 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13886 m_errorMonitor->VerifyFound();
13887
13888 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13889}
13890
13891TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13892 TEST_DESCRIPTION(
13893 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13894
Tony Barbour1fa09702017-03-16 12:09:08 -060013895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13897
13898 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013899 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013900
13901 // Some awkward steps are required to test with custom device features.
13902 std::vector<const char *> device_extension_names;
13903 auto features = m_device->phy().features();
13904 // Disable support for 64 bit floats
13905 features.shaderFloat64 = false;
13906 // The sacrificial device object
13907 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013909 char const *vsSource =
13910 "#version 450\n"
13911 "\n"
13912 "out gl_PerVertex {\n"
13913 " vec4 gl_Position;\n"
13914 "};\n"
13915 "void main(){\n"
13916 " gl_Position = vec4(1);\n"
13917 "}\n";
13918 char const *fsSource =
13919 "#version 450\n"
13920 "\n"
13921 "layout(location=0) out vec4 color;\n"
13922 "void main(){\n"
13923 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13924 " color = vec4(green);\n"
13925 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013926
13927 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13928 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13929
13930 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013931
13932 VkPipelineObj pipe(&test_device);
13933 pipe.AddColorAttachment();
13934 pipe.AddShader(&vs);
13935 pipe.AddShader(&fs);
13936
13937 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13938 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13939 VkPipelineLayout pipeline_layout;
13940 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13941
13942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13943 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13944 m_errorMonitor->VerifyFound();
13945
13946 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13947}
13948
Mark Lobodzinski20832822017-03-24 14:49:45 -060013949TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13950 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13951 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013952
Tony Barbour1fa09702017-03-16 12:09:08 -060013953 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13955
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013956 char const *vsSource =
13957 "#version 450\n"
13958 "\n"
13959 "out gl_PerVertex {\n"
13960 " vec4 gl_Position;\n"
13961 "};\n"
13962 "layout(xfb_buffer = 1) out;"
13963 "void main(){\n"
13964 " gl_Position = vec4(1);\n"
13965 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013966
Mark Lobodzinski20832822017-03-24 14:49:45 -060013967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013968
Mark Lobodzinski20832822017-03-24 14:49:45 -060013969 std::vector<unsigned int> spv;
13970 VkShaderModuleCreateInfo module_create_info;
13971 VkShaderModule shader_module;
13972 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13973 module_create_info.pNext = NULL;
13974 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13975 module_create_info.pCode = spv.data();
13976 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13977 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013978
Mark Lobodzinski20832822017-03-24 14:49:45 -060013979 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013980
Mark Lobodzinski20832822017-03-24 14:49:45 -060013981 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013982}
13983
Karl Schultz6addd812016-02-02 17:17:23 -070013984TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013985 TEST_DESCRIPTION(
13986 "Test that an error is produced for a fragment shader input "
13987 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013990
Tony Barbour1fa09702017-03-16 12:09:08 -060013991 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013993
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013994 char const *vsSource =
13995 "#version 450\n"
13996 "\n"
13997 "out gl_PerVertex {\n"
13998 " vec4 gl_Position;\n"
13999 "};\n"
14000 "void main(){\n"
14001 " gl_Position = vec4(1);\n"
14002 "}\n";
14003 char const *fsSource =
14004 "#version 450\n"
14005 "\n"
14006 "layout(location=0) in float x;\n"
14007 "layout(location=0) out vec4 color;\n"
14008 "void main(){\n"
14009 " color = vec4(x);\n"
14010 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014011
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014012 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14013 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014014
14015 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014016 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014017 pipe.AddShader(&vs);
14018 pipe.AddShader(&fs);
14019
Chris Forbes59cb88d2015-05-25 11:13:13 +120014020 VkDescriptorSetObj descriptorSet(m_device);
14021 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014022 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014023
Tony Barbour5781e8f2015-08-04 16:23:11 -060014024 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014025
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014026 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014027}
14028
Karl Schultz6addd812016-02-02 17:17:23 -070014029TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014030 TEST_DESCRIPTION(
14031 "Test that an error is produced for a fragment shader input "
14032 "within an interace block, which is not present in the outputs "
14033 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014035
Tony Barbour1fa09702017-03-16 12:09:08 -060014036 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14038
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014039 char const *vsSource =
14040 "#version 450\n"
14041 "\n"
14042 "out gl_PerVertex {\n"
14043 " vec4 gl_Position;\n"
14044 "};\n"
14045 "void main(){\n"
14046 " gl_Position = vec4(1);\n"
14047 "}\n";
14048 char const *fsSource =
14049 "#version 450\n"
14050 "\n"
14051 "in block { layout(location=0) float x; } ins;\n"
14052 "layout(location=0) out vec4 color;\n"
14053 "void main(){\n"
14054 " color = vec4(ins.x);\n"
14055 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014056
14057 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14058 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14059
14060 VkPipelineObj pipe(m_device);
14061 pipe.AddColorAttachment();
14062 pipe.AddShader(&vs);
14063 pipe.AddShader(&fs);
14064
14065 VkDescriptorSetObj descriptorSet(m_device);
14066 descriptorSet.AppendDummy();
14067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14068
14069 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14070
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014071 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014072}
14073
Karl Schultz6addd812016-02-02 17:17:23 -070014074TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014075 TEST_DESCRIPTION(
14076 "Test that an error is produced for mismatched array sizes "
14077 "across the vertex->fragment shader interface");
14078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14079 "Type mismatch on location 0.0: 'ptr to "
14080 "output arr[2] of float32' vs 'ptr to "
14081 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014082
Tony Barbour1fa09702017-03-16 12:09:08 -060014083 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14085
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014086 char const *vsSource =
14087 "#version 450\n"
14088 "\n"
14089 "layout(location=0) out float x[2];\n"
14090 "out gl_PerVertex {\n"
14091 " vec4 gl_Position;\n"
14092 "};\n"
14093 "void main(){\n"
14094 " x[0] = 0; x[1] = 0;\n"
14095 " gl_Position = vec4(1);\n"
14096 "}\n";
14097 char const *fsSource =
14098 "#version 450\n"
14099 "\n"
14100 "layout(location=0) in float x[1];\n"
14101 "layout(location=0) out vec4 color;\n"
14102 "void main(){\n"
14103 " color = vec4(x[0]);\n"
14104 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014105
14106 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14107 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14108
14109 VkPipelineObj pipe(m_device);
14110 pipe.AddColorAttachment();
14111 pipe.AddShader(&vs);
14112 pipe.AddShader(&fs);
14113
14114 VkDescriptorSetObj descriptorSet(m_device);
14115 descriptorSet.AppendDummy();
14116 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14117
14118 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14119
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014120 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014121}
14122
Karl Schultz6addd812016-02-02 17:17:23 -070014123TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014124 TEST_DESCRIPTION(
14125 "Test that an error is produced for mismatched types across "
14126 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014128
Tony Barbour1fa09702017-03-16 12:09:08 -060014129 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014131
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014132 char const *vsSource =
14133 "#version 450\n"
14134 "\n"
14135 "layout(location=0) out int x;\n"
14136 "out gl_PerVertex {\n"
14137 " vec4 gl_Position;\n"
14138 "};\n"
14139 "void main(){\n"
14140 " x = 0;\n"
14141 " gl_Position = vec4(1);\n"
14142 "}\n";
14143 char const *fsSource =
14144 "#version 450\n"
14145 "\n"
14146 "layout(location=0) in float x;\n" /* VS writes int */
14147 "layout(location=0) out vec4 color;\n"
14148 "void main(){\n"
14149 " color = vec4(x);\n"
14150 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014151
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014152 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14153 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014154
14155 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014156 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014157 pipe.AddShader(&vs);
14158 pipe.AddShader(&fs);
14159
Chris Forbesb56af562015-05-25 11:13:17 +120014160 VkDescriptorSetObj descriptorSet(m_device);
14161 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014162 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014163
Tony Barbour5781e8f2015-08-04 16:23:11 -060014164 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014165
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014166 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014167}
14168
Karl Schultz6addd812016-02-02 17:17:23 -070014169TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014170 TEST_DESCRIPTION(
14171 "Test that an error is produced for mismatched types across "
14172 "the vertex->fragment shader interface, when the variable is contained within "
14173 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014175
Tony Barbour1fa09702017-03-16 12:09:08 -060014176 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14178
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014179 char const *vsSource =
14180 "#version 450\n"
14181 "\n"
14182 "out block { layout(location=0) int x; } outs;\n"
14183 "out gl_PerVertex {\n"
14184 " vec4 gl_Position;\n"
14185 "};\n"
14186 "void main(){\n"
14187 " outs.x = 0;\n"
14188 " gl_Position = vec4(1);\n"
14189 "}\n";
14190 char const *fsSource =
14191 "#version 450\n"
14192 "\n"
14193 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14194 "layout(location=0) out vec4 color;\n"
14195 "void main(){\n"
14196 " color = vec4(ins.x);\n"
14197 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014198
14199 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14200 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14201
14202 VkPipelineObj pipe(m_device);
14203 pipe.AddColorAttachment();
14204 pipe.AddShader(&vs);
14205 pipe.AddShader(&fs);
14206
14207 VkDescriptorSetObj descriptorSet(m_device);
14208 descriptorSet.AppendDummy();
14209 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14210
14211 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14212
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014213 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014214}
14215
14216TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014217 TEST_DESCRIPTION(
14218 "Test that an error is produced for location mismatches across "
14219 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14220 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014221 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 +130014222
Tony Barbour1fa09702017-03-16 12:09:08 -060014223 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14225
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014226 char const *vsSource =
14227 "#version 450\n"
14228 "\n"
14229 "out block { layout(location=1) float x; } outs;\n"
14230 "out gl_PerVertex {\n"
14231 " vec4 gl_Position;\n"
14232 "};\n"
14233 "void main(){\n"
14234 " outs.x = 0;\n"
14235 " gl_Position = vec4(1);\n"
14236 "}\n";
14237 char const *fsSource =
14238 "#version 450\n"
14239 "\n"
14240 "in block { layout(location=0) float x; } ins;\n"
14241 "layout(location=0) out vec4 color;\n"
14242 "void main(){\n"
14243 " color = vec4(ins.x);\n"
14244 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014245
14246 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14247 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14248
14249 VkPipelineObj pipe(m_device);
14250 pipe.AddColorAttachment();
14251 pipe.AddShader(&vs);
14252 pipe.AddShader(&fs);
14253
14254 VkDescriptorSetObj descriptorSet(m_device);
14255 descriptorSet.AppendDummy();
14256 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14257
14258 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14259
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014260 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014261}
14262
14263TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014264 TEST_DESCRIPTION(
14265 "Test that an error is produced for component mismatches across the "
14266 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14267 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014268 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 +130014269
Tony Barbour1fa09702017-03-16 12:09:08 -060014270 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14272
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014273 char const *vsSource =
14274 "#version 450\n"
14275 "\n"
14276 "out block { layout(location=0, component=0) float x; } outs;\n"
14277 "out gl_PerVertex {\n"
14278 " vec4 gl_Position;\n"
14279 "};\n"
14280 "void main(){\n"
14281 " outs.x = 0;\n"
14282 " gl_Position = vec4(1);\n"
14283 "}\n";
14284 char const *fsSource =
14285 "#version 450\n"
14286 "\n"
14287 "in block { layout(location=0, component=1) float x; } ins;\n"
14288 "layout(location=0) out vec4 color;\n"
14289 "void main(){\n"
14290 " color = vec4(ins.x);\n"
14291 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014292
14293 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14294 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14295
14296 VkPipelineObj pipe(m_device);
14297 pipe.AddColorAttachment();
14298 pipe.AddShader(&vs);
14299 pipe.AddShader(&fs);
14300
14301 VkDescriptorSetObj descriptorSet(m_device);
14302 descriptorSet.AppendDummy();
14303 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14304
14305 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14306
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014307 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014308}
14309
Chris Forbes1f3b0152016-11-30 12:48:40 +130014310TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14311 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14312
Tony Barbour1fa09702017-03-16 12:09:08 -060014313 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14315
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014316 char const *vsSource =
14317 "#version 450\n"
14318 "layout(location=0) out mediump float x;\n"
14319 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14320 char const *fsSource =
14321 "#version 450\n"
14322 "layout(location=0) in highp float x;\n"
14323 "layout(location=0) out vec4 color;\n"
14324 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014325
14326 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14327 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14328
14329 VkPipelineObj pipe(m_device);
14330 pipe.AddColorAttachment();
14331 pipe.AddShader(&vs);
14332 pipe.AddShader(&fs);
14333
14334 VkDescriptorSetObj descriptorSet(m_device);
14335 descriptorSet.AppendDummy();
14336 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14337
14338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14339
14340 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14341
14342 m_errorMonitor->VerifyFound();
14343}
14344
Chris Forbes870a39e2016-11-30 12:55:56 +130014345TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14346 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14347
Tony Barbour1fa09702017-03-16 12:09:08 -060014348 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14350
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014351 char const *vsSource =
14352 "#version 450\n"
14353 "out block { layout(location=0) mediump float x; };\n"
14354 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14355 char const *fsSource =
14356 "#version 450\n"
14357 "in block { layout(location=0) highp float x; };\n"
14358 "layout(location=0) out vec4 color;\n"
14359 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014360
14361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14363
14364 VkPipelineObj pipe(m_device);
14365 pipe.AddColorAttachment();
14366 pipe.AddShader(&vs);
14367 pipe.AddShader(&fs);
14368
14369 VkDescriptorSetObj descriptorSet(m_device);
14370 descriptorSet.AppendDummy();
14371 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14372
14373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14374
14375 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14376
14377 m_errorMonitor->VerifyFound();
14378}
14379
Karl Schultz6addd812016-02-02 17:17:23 -070014380TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014381 TEST_DESCRIPTION(
14382 "Test that a warning is produced for a vertex attribute which is "
14383 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014385
Tony Barbour1fa09702017-03-16 12:09:08 -060014386 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014388
14389 VkVertexInputBindingDescription input_binding;
14390 memset(&input_binding, 0, sizeof(input_binding));
14391
14392 VkVertexInputAttributeDescription input_attrib;
14393 memset(&input_attrib, 0, sizeof(input_attrib));
14394 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14395
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014396 char const *vsSource =
14397 "#version 450\n"
14398 "\n"
14399 "out gl_PerVertex {\n"
14400 " vec4 gl_Position;\n"
14401 "};\n"
14402 "void main(){\n"
14403 " gl_Position = vec4(1);\n"
14404 "}\n";
14405 char const *fsSource =
14406 "#version 450\n"
14407 "\n"
14408 "layout(location=0) out vec4 color;\n"
14409 "void main(){\n"
14410 " color = vec4(1);\n"
14411 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014412
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014415
14416 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014417 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014418 pipe.AddShader(&vs);
14419 pipe.AddShader(&fs);
14420
14421 pipe.AddVertexInputBindings(&input_binding, 1);
14422 pipe.AddVertexInputAttribs(&input_attrib, 1);
14423
Chris Forbesde136e02015-05-25 11:13:28 +120014424 VkDescriptorSetObj descriptorSet(m_device);
14425 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014426 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014427
Tony Barbour5781e8f2015-08-04 16:23:11 -060014428 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014429
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014430 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014431}
14432
Karl Schultz6addd812016-02-02 17:17:23 -070014433TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014434 TEST_DESCRIPTION(
14435 "Test that a warning is produced for a location mismatch on "
14436 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014438
Tony Barbour1fa09702017-03-16 12:09:08 -060014439 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14441
14442 VkVertexInputBindingDescription input_binding;
14443 memset(&input_binding, 0, sizeof(input_binding));
14444
14445 VkVertexInputAttributeDescription input_attrib;
14446 memset(&input_attrib, 0, sizeof(input_attrib));
14447 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14448
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014449 char const *vsSource =
14450 "#version 450\n"
14451 "\n"
14452 "layout(location=1) in float x;\n"
14453 "out gl_PerVertex {\n"
14454 " vec4 gl_Position;\n"
14455 "};\n"
14456 "void main(){\n"
14457 " gl_Position = vec4(x);\n"
14458 "}\n";
14459 char const *fsSource =
14460 "#version 450\n"
14461 "\n"
14462 "layout(location=0) out vec4 color;\n"
14463 "void main(){\n"
14464 " color = vec4(1);\n"
14465 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014466
14467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14469
14470 VkPipelineObj pipe(m_device);
14471 pipe.AddColorAttachment();
14472 pipe.AddShader(&vs);
14473 pipe.AddShader(&fs);
14474
14475 pipe.AddVertexInputBindings(&input_binding, 1);
14476 pipe.AddVertexInputAttribs(&input_attrib, 1);
14477
14478 VkDescriptorSetObj descriptorSet(m_device);
14479 descriptorSet.AppendDummy();
14480 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14481
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014482 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014483 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14484
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014485 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014486}
14487
Karl Schultz6addd812016-02-02 17:17:23 -070014488TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014489 TEST_DESCRIPTION(
14490 "Test that an error is produced for a vertex shader input which is not "
14491 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14493 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014494
Tony Barbour1fa09702017-03-16 12:09:08 -060014495 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014497
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014498 char const *vsSource =
14499 "#version 450\n"
14500 "\n"
14501 "layout(location=0) in vec4 x;\n" /* not provided */
14502 "out gl_PerVertex {\n"
14503 " vec4 gl_Position;\n"
14504 "};\n"
14505 "void main(){\n"
14506 " gl_Position = x;\n"
14507 "}\n";
14508 char const *fsSource =
14509 "#version 450\n"
14510 "\n"
14511 "layout(location=0) out vec4 color;\n"
14512 "void main(){\n"
14513 " color = vec4(1);\n"
14514 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014515
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014516 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014518
14519 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014520 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014521 pipe.AddShader(&vs);
14522 pipe.AddShader(&fs);
14523
Chris Forbes62e8e502015-05-25 11:13:29 +120014524 VkDescriptorSetObj descriptorSet(m_device);
14525 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014526 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014527
Tony Barbour5781e8f2015-08-04 16:23:11 -060014528 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014529
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014530 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014531}
14532
Karl Schultz6addd812016-02-02 17:17:23 -070014533TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014534 TEST_DESCRIPTION(
14535 "Test that an error is produced for a mismatch between the "
14536 "fundamental type (float/int/uint) of an attribute and the "
14537 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014538 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 -060014539
Tony Barbour1fa09702017-03-16 12:09:08 -060014540 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014542
14543 VkVertexInputBindingDescription input_binding;
14544 memset(&input_binding, 0, sizeof(input_binding));
14545
14546 VkVertexInputAttributeDescription input_attrib;
14547 memset(&input_attrib, 0, sizeof(input_attrib));
14548 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14549
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014550 char const *vsSource =
14551 "#version 450\n"
14552 "\n"
14553 "layout(location=0) in int x;\n" /* attrib provided float */
14554 "out gl_PerVertex {\n"
14555 " vec4 gl_Position;\n"
14556 "};\n"
14557 "void main(){\n"
14558 " gl_Position = vec4(x);\n"
14559 "}\n";
14560 char const *fsSource =
14561 "#version 450\n"
14562 "\n"
14563 "layout(location=0) out vec4 color;\n"
14564 "void main(){\n"
14565 " color = vec4(1);\n"
14566 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014567
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014568 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14569 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014570
14571 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014572 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014573 pipe.AddShader(&vs);
14574 pipe.AddShader(&fs);
14575
14576 pipe.AddVertexInputBindings(&input_binding, 1);
14577 pipe.AddVertexInputAttribs(&input_attrib, 1);
14578
Chris Forbesc97d98e2015-05-25 11:13:31 +120014579 VkDescriptorSetObj descriptorSet(m_device);
14580 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014581 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014582
Tony Barbour5781e8f2015-08-04 16:23:11 -060014583 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014584
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014585 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014586}
14587
Chris Forbesc68b43c2016-04-06 11:18:47 +120014588TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014589 TEST_DESCRIPTION(
14590 "Test that an error is produced for a pipeline containing multiple "
14591 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14593 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014594
Tony Barbour1fa09702017-03-16 12:09:08 -060014595 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14597
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014598 char const *vsSource =
14599 "#version 450\n"
14600 "\n"
14601 "out gl_PerVertex {\n"
14602 " vec4 gl_Position;\n"
14603 "};\n"
14604 "void main(){\n"
14605 " gl_Position = vec4(1);\n"
14606 "}\n";
14607 char const *fsSource =
14608 "#version 450\n"
14609 "\n"
14610 "layout(location=0) out vec4 color;\n"
14611 "void main(){\n"
14612 " color = vec4(1);\n"
14613 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014614
14615 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14616 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14617
14618 VkPipelineObj pipe(m_device);
14619 pipe.AddColorAttachment();
14620 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014621 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014622 pipe.AddShader(&fs);
14623
14624 VkDescriptorSetObj descriptorSet(m_device);
14625 descriptorSet.AppendDummy();
14626 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14627
14628 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14629
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014630 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014631}
14632
Chris Forbes82ff92a2016-09-09 10:50:24 +120014633TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014635
Tony Barbour1fa09702017-03-16 12:09:08 -060014636 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14638
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014639 char const *vsSource =
14640 "#version 450\n"
14641 "out gl_PerVertex {\n"
14642 " vec4 gl_Position;\n"
14643 "};\n"
14644 "void main(){\n"
14645 " gl_Position = vec4(0);\n"
14646 "}\n";
14647 char const *fsSource =
14648 "#version 450\n"
14649 "\n"
14650 "layout(location=0) out vec4 color;\n"
14651 "void main(){\n"
14652 " color = vec4(1);\n"
14653 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014654
14655 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14656 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14657
14658 VkPipelineObj pipe(m_device);
14659 pipe.AddColorAttachment();
14660 pipe.AddShader(&vs);
14661 pipe.AddShader(&fs);
14662
14663 VkDescriptorSetObj descriptorSet(m_device);
14664 descriptorSet.AppendDummy();
14665 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14666
14667 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14668
14669 m_errorMonitor->VerifyFound();
14670}
14671
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014672TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14674 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14675 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014676
Tony Barbour1fa09702017-03-16 12:09:08 -060014677 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14679
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014680 char const *vsSource =
14681 "#version 450\n"
14682 "void main(){ gl_Position = vec4(0); }\n";
14683 char const *fsSource =
14684 "#version 450\n"
14685 "\n"
14686 "layout(location=0) out vec4 color;\n"
14687 "void main(){\n"
14688 " color = vec4(1);\n"
14689 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014690
14691 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14692 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14693
14694 VkPipelineObj pipe(m_device);
14695 pipe.AddColorAttachment();
14696 pipe.AddShader(&vs);
14697 pipe.AddShader(&fs);
14698
14699 VkDescriptorSetObj descriptorSet(m_device);
14700 descriptorSet.AppendDummy();
14701 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14702
14703 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014704 {
14705 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14706 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14707 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014708 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014709 {
14710 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14711 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14712 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014713 },
14714 };
14715 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014716 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014717 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014718 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14719 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014720 VkRenderPass rp;
14721 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14722 ASSERT_VK_SUCCESS(err);
14723
14724 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14725
14726 m_errorMonitor->VerifyFound();
14727
14728 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14729}
14730
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014731TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014732 TEST_DESCRIPTION(
14733 "Test that an error is produced for a variable output from "
14734 "the TCS without the patch decoration, but consumed in the TES "
14735 "with the decoration.");
14736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14737 "is per-vertex in tessellation control shader stage "
14738 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014739
Tony Barbour1fa09702017-03-16 12:09:08 -060014740 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14742
Chris Forbesc1e852d2016-04-04 19:26:42 +120014743 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014744 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014745 return;
14746 }
14747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014748 char const *vsSource =
14749 "#version 450\n"
14750 "void main(){}\n";
14751 char const *tcsSource =
14752 "#version 450\n"
14753 "layout(location=0) out int x[];\n"
14754 "layout(vertices=3) out;\n"
14755 "void main(){\n"
14756 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14757 " gl_TessLevelInner[0] = 1;\n"
14758 " x[gl_InvocationID] = gl_InvocationID;\n"
14759 "}\n";
14760 char const *tesSource =
14761 "#version 450\n"
14762 "layout(triangles, equal_spacing, cw) in;\n"
14763 "layout(location=0) patch in int x;\n"
14764 "out gl_PerVertex { vec4 gl_Position; };\n"
14765 "void main(){\n"
14766 " gl_Position.xyz = gl_TessCoord;\n"
14767 " gl_Position.w = x;\n"
14768 "}\n";
14769 char const *fsSource =
14770 "#version 450\n"
14771 "layout(location=0) out vec4 color;\n"
14772 "void main(){\n"
14773 " color = vec4(1);\n"
14774 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014775
14776 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14777 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14778 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14779 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14780
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014781 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14782 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014783
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014784 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014785
14786 VkPipelineObj pipe(m_device);
14787 pipe.SetInputAssembly(&iasci);
14788 pipe.SetTessellation(&tsci);
14789 pipe.AddColorAttachment();
14790 pipe.AddShader(&vs);
14791 pipe.AddShader(&tcs);
14792 pipe.AddShader(&tes);
14793 pipe.AddShader(&fs);
14794
14795 VkDescriptorSetObj descriptorSet(m_device);
14796 descriptorSet.AppendDummy();
14797 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14798
14799 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14800
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014801 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014802}
14803
Karl Schultz6addd812016-02-02 17:17:23 -070014804TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014805 TEST_DESCRIPTION(
14806 "Test that an error is produced for a vertex attribute setup where multiple "
14807 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14809 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014810
Tony Barbour1fa09702017-03-16 12:09:08 -060014811 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014813
14814 /* Two binding descriptions for binding 0 */
14815 VkVertexInputBindingDescription input_bindings[2];
14816 memset(input_bindings, 0, sizeof(input_bindings));
14817
14818 VkVertexInputAttributeDescription input_attrib;
14819 memset(&input_attrib, 0, sizeof(input_attrib));
14820 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14821
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014822 char const *vsSource =
14823 "#version 450\n"
14824 "\n"
14825 "layout(location=0) in float x;\n" /* attrib provided float */
14826 "out gl_PerVertex {\n"
14827 " vec4 gl_Position;\n"
14828 "};\n"
14829 "void main(){\n"
14830 " gl_Position = vec4(x);\n"
14831 "}\n";
14832 char const *fsSource =
14833 "#version 450\n"
14834 "\n"
14835 "layout(location=0) out vec4 color;\n"
14836 "void main(){\n"
14837 " color = vec4(1);\n"
14838 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014839
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014840 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14841 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014842
14843 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014844 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014845 pipe.AddShader(&vs);
14846 pipe.AddShader(&fs);
14847
14848 pipe.AddVertexInputBindings(input_bindings, 2);
14849 pipe.AddVertexInputAttribs(&input_attrib, 1);
14850
Chris Forbes280ba2c2015-06-12 11:16:41 +120014851 VkDescriptorSetObj descriptorSet(m_device);
14852 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014853 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014854
Tony Barbour5781e8f2015-08-04 16:23:11 -060014855 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014857 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014858}
Chris Forbes8f68b562015-05-25 11:13:32 +120014859
Karl Schultz6addd812016-02-02 17:17:23 -070014860TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014861 TEST_DESCRIPTION(
14862 "Test that an error is produced for a fragment shader which does not "
14863 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014865
Tony Barbour1fa09702017-03-16 12:09:08 -060014866 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014868 char const *vsSource =
14869 "#version 450\n"
14870 "\n"
14871 "out gl_PerVertex {\n"
14872 " vec4 gl_Position;\n"
14873 "};\n"
14874 "void main(){\n"
14875 " gl_Position = vec4(1);\n"
14876 "}\n";
14877 char const *fsSource =
14878 "#version 450\n"
14879 "\n"
14880 "void main(){\n"
14881 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014882
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014883 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14884 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014885
14886 VkPipelineObj pipe(m_device);
14887 pipe.AddShader(&vs);
14888 pipe.AddShader(&fs);
14889
Chia-I Wu08accc62015-07-07 11:50:03 +080014890 /* set up CB 0, not written */
14891 pipe.AddColorAttachment();
14892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014893
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014894 VkDescriptorSetObj descriptorSet(m_device);
14895 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014896 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897
Tony Barbour5781e8f2015-08-04 16:23:11 -060014898 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014899
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014900 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014901}
14902
Karl Schultz6addd812016-02-02 17:17:23 -070014903TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014904 TEST_DESCRIPTION(
14905 "Test that a warning is produced for a fragment shader which provides a spurious "
14906 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014908 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014909
Tony Barbour1fa09702017-03-16 12:09:08 -060014910 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014911
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014912 char const *vsSource =
14913 "#version 450\n"
14914 "\n"
14915 "out gl_PerVertex {\n"
14916 " vec4 gl_Position;\n"
14917 "};\n"
14918 "void main(){\n"
14919 " gl_Position = vec4(1);\n"
14920 "}\n";
14921 char const *fsSource =
14922 "#version 450\n"
14923 "\n"
14924 "layout(location=0) out vec4 x;\n"
14925 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14926 "void main(){\n"
14927 " x = vec4(1);\n"
14928 " y = vec4(1);\n"
14929 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014930
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014931 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14932 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014933
14934 VkPipelineObj pipe(m_device);
14935 pipe.AddShader(&vs);
14936 pipe.AddShader(&fs);
14937
Chia-I Wu08accc62015-07-07 11:50:03 +080014938 /* set up CB 0, not written */
14939 pipe.AddColorAttachment();
14940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014941 /* FS writes CB 1, but we don't configure it */
14942
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014943 VkDescriptorSetObj descriptorSet(m_device);
14944 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014945 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014946
Tony Barbour5781e8f2015-08-04 16:23:11 -060014947 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014948
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014949 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014950}
14951
Karl Schultz6addd812016-02-02 17:17:23 -070014952TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014953 TEST_DESCRIPTION(
14954 "Test that an error is produced for a mismatch between the fundamental "
14955 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014957
Tony Barbour1fa09702017-03-16 12:09:08 -060014958 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014959
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014960 char const *vsSource =
14961 "#version 450\n"
14962 "\n"
14963 "out gl_PerVertex {\n"
14964 " vec4 gl_Position;\n"
14965 "};\n"
14966 "void main(){\n"
14967 " gl_Position = vec4(1);\n"
14968 "}\n";
14969 char const *fsSource =
14970 "#version 450\n"
14971 "\n"
14972 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14973 "void main(){\n"
14974 " x = ivec4(1);\n"
14975 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014976
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014979
14980 VkPipelineObj pipe(m_device);
14981 pipe.AddShader(&vs);
14982 pipe.AddShader(&fs);
14983
Chia-I Wu08accc62015-07-07 11:50:03 +080014984 /* set up CB 0; type is UNORM by default */
14985 pipe.AddColorAttachment();
14986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014987
Chris Forbesa36d69e2015-05-25 11:13:44 +120014988 VkDescriptorSetObj descriptorSet(m_device);
14989 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014990 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991
Tony Barbour5781e8f2015-08-04 16:23:11 -060014992 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014993
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014994 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014995}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014996
Karl Schultz6addd812016-02-02 17:17:23 -070014997TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014998 TEST_DESCRIPTION(
14999 "Test that an error is produced for a shader consuming a uniform "
15000 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015002
Tony Barbour1fa09702017-03-16 12:09:08 -060015003 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015004
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015005 char const *vsSource =
15006 "#version 450\n"
15007 "\n"
15008 "out gl_PerVertex {\n"
15009 " vec4 gl_Position;\n"
15010 "};\n"
15011 "void main(){\n"
15012 " gl_Position = vec4(1);\n"
15013 "}\n";
15014 char const *fsSource =
15015 "#version 450\n"
15016 "\n"
15017 "layout(location=0) out vec4 x;\n"
15018 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15019 "void main(){\n"
15020 " x = vec4(bar.y);\n"
15021 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015022
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015023 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15024 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015025
Chris Forbes556c76c2015-08-14 12:04:59 +120015026 VkPipelineObj pipe(m_device);
15027 pipe.AddShader(&vs);
15028 pipe.AddShader(&fs);
15029
15030 /* set up CB 0; type is UNORM by default */
15031 pipe.AddColorAttachment();
15032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15033
15034 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015035 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015036
15037 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015039 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015040}
15041
Chris Forbes5c59e902016-02-26 16:56:09 +130015042TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015043 TEST_DESCRIPTION(
15044 "Test that an error is produced for a shader consuming push constants "
15045 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015047
Tony Barbour1fa09702017-03-16 12:09:08 -060015048 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015049
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015050 char const *vsSource =
15051 "#version 450\n"
15052 "\n"
15053 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15054 "out gl_PerVertex {\n"
15055 " vec4 gl_Position;\n"
15056 "};\n"
15057 "void main(){\n"
15058 " gl_Position = vec4(consts.x);\n"
15059 "}\n";
15060 char const *fsSource =
15061 "#version 450\n"
15062 "\n"
15063 "layout(location=0) out vec4 x;\n"
15064 "void main(){\n"
15065 " x = vec4(1);\n"
15066 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015067
15068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15070
15071 VkPipelineObj pipe(m_device);
15072 pipe.AddShader(&vs);
15073 pipe.AddShader(&fs);
15074
15075 /* set up CB 0; type is UNORM by default */
15076 pipe.AddColorAttachment();
15077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15078
15079 VkDescriptorSetObj descriptorSet(m_device);
15080 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15081
15082 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15083
15084 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015085 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015086}
15087
Chris Forbes3fb17902016-08-22 14:57:55 +120015088TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015089 TEST_DESCRIPTION(
15090 "Test that an error is produced for a shader consuming an input attachment "
15091 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15093 "consumes input attachment index 0 but not provided in subpass");
15094
Tony Barbour1fa09702017-03-16 12:09:08 -060015095 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015096
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015097 char const *vsSource =
15098 "#version 450\n"
15099 "\n"
15100 "out gl_PerVertex {\n"
15101 " vec4 gl_Position;\n"
15102 "};\n"
15103 "void main(){\n"
15104 " gl_Position = vec4(1);\n"
15105 "}\n";
15106 char const *fsSource =
15107 "#version 450\n"
15108 "\n"
15109 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15110 "layout(location=0) out vec4 color;\n"
15111 "void main() {\n"
15112 " color = subpassLoad(x);\n"
15113 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015114
15115 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15116 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15117
15118 VkPipelineObj pipe(m_device);
15119 pipe.AddShader(&vs);
15120 pipe.AddShader(&fs);
15121 pipe.AddColorAttachment();
15122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15123
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015124 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15125 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015126 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015127 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015128 ASSERT_VK_SUCCESS(err);
15129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015130 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015131 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015132 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015133 ASSERT_VK_SUCCESS(err);
15134
15135 // error here.
15136 pipe.CreateVKPipeline(pl, renderPass());
15137
15138 m_errorMonitor->VerifyFound();
15139
15140 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15141 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15142}
15143
Chris Forbes5a9a0472016-08-22 16:02:09 +120015144TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015145 TEST_DESCRIPTION(
15146 "Test that an error is produced for a shader consuming an input attachment "
15147 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15149 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15150
Tony Barbour1fa09702017-03-16 12:09:08 -060015151 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015153 char const *vsSource =
15154 "#version 450\n"
15155 "\n"
15156 "out gl_PerVertex {\n"
15157 " vec4 gl_Position;\n"
15158 "};\n"
15159 "void main(){\n"
15160 " gl_Position = vec4(1);\n"
15161 "}\n";
15162 char const *fsSource =
15163 "#version 450\n"
15164 "\n"
15165 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15166 "layout(location=0) out vec4 color;\n"
15167 "void main() {\n"
15168 " color = subpassLoad(x);\n"
15169 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015170
15171 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15173
15174 VkPipelineObj pipe(m_device);
15175 pipe.AddShader(&vs);
15176 pipe.AddShader(&fs);
15177 pipe.AddColorAttachment();
15178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015180 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15181 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015182 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015183 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015184 ASSERT_VK_SUCCESS(err);
15185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015186 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015187 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015188 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015189 ASSERT_VK_SUCCESS(err);
15190
15191 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015192 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15193 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15194 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15195 {0, VK_FORMAT_R8G8B8A8_UINT, 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_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120015197 };
15198 VkAttachmentReference color = {
15199 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15200 };
15201 VkAttachmentReference input = {
15202 1, VK_IMAGE_LAYOUT_GENERAL,
15203 };
15204
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015205 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015206
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015207 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015208 VkRenderPass rp;
15209 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15210 ASSERT_VK_SUCCESS(err);
15211
15212 // error here.
15213 pipe.CreateVKPipeline(pl, rp);
15214
15215 m_errorMonitor->VerifyFound();
15216
15217 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15218 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15219 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15220}
15221
Chris Forbes541f7b02016-08-22 15:30:27 +120015222TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015223 TEST_DESCRIPTION(
15224 "Test that an error is produced for a shader consuming an input attachment "
15225 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015227 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015228
Tony Barbour1fa09702017-03-16 12:09:08 -060015229 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015230
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015231 char const *vsSource =
15232 "#version 450\n"
15233 "\n"
15234 "out gl_PerVertex {\n"
15235 " vec4 gl_Position;\n"
15236 "};\n"
15237 "void main(){\n"
15238 " gl_Position = vec4(1);\n"
15239 "}\n";
15240 char const *fsSource =
15241 "#version 450\n"
15242 "\n"
15243 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15244 "layout(location=0) out vec4 color;\n"
15245 "void main() {\n"
15246 " color = subpassLoad(xs[0]);\n"
15247 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015248
15249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15251
15252 VkPipelineObj pipe(m_device);
15253 pipe.AddShader(&vs);
15254 pipe.AddShader(&fs);
15255 pipe.AddColorAttachment();
15256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015258 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15259 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015260 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015261 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015262 ASSERT_VK_SUCCESS(err);
15263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015264 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015265 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015266 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015267 ASSERT_VK_SUCCESS(err);
15268
15269 // error here.
15270 pipe.CreateVKPipeline(pl, renderPass());
15271
15272 m_errorMonitor->VerifyFound();
15273
15274 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15275 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15276}
15277
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015278TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015279 TEST_DESCRIPTION(
15280 "Test that an error is produced for a compute pipeline consuming a "
15281 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015283
Tony Barbour1fa09702017-03-16 12:09:08 -060015284 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015285
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015286 char const *csSource =
15287 "#version 450\n"
15288 "\n"
15289 "layout(local_size_x=1) in;\n"
15290 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15291 "void main(){\n"
15292 " x = vec4(1);\n"
15293 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015294
15295 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15296
15297 VkDescriptorSetObj descriptorSet(m_device);
15298 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15299
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015300 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15301 nullptr,
15302 0,
15303 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15304 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15305 descriptorSet.GetPipelineLayout(),
15306 VK_NULL_HANDLE,
15307 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015308
15309 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015310 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015311
15312 m_errorMonitor->VerifyFound();
15313
15314 if (err == VK_SUCCESS) {
15315 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15316 }
15317}
15318
Chris Forbes22a9b092016-07-19 14:34:05 +120015319TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015320 TEST_DESCRIPTION(
15321 "Test that an error is produced for a pipeline consuming a "
15322 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15324 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015325
Tony Barbour1fa09702017-03-16 12:09:08 -060015326 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015327
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015328 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15329 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015330 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015331 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015332 ASSERT_VK_SUCCESS(err);
15333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015334 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015335 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015336 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015337 ASSERT_VK_SUCCESS(err);
15338
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015339 char const *csSource =
15340 "#version 450\n"
15341 "\n"
15342 "layout(local_size_x=1) in;\n"
15343 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15344 "void main() {\n"
15345 " x.x = 1.0f;\n"
15346 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015347 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15348
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015349 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15350 nullptr,
15351 0,
15352 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15353 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15354 pl,
15355 VK_NULL_HANDLE,
15356 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015357
15358 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015359 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015360
15361 m_errorMonitor->VerifyFound();
15362
15363 if (err == VK_SUCCESS) {
15364 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15365 }
15366
15367 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15368 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15369}
15370
Chris Forbes50020592016-07-27 13:52:41 +120015371TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015372 TEST_DESCRIPTION(
15373 "Test that an error is produced when an image view type "
15374 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015376 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 +120015377
Tony Barbour1fa09702017-03-16 12:09:08 -060015378 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015381 char const *vsSource =
15382 "#version 450\n"
15383 "\n"
15384 "out gl_PerVertex { vec4 gl_Position; };\n"
15385 "void main() { gl_Position = vec4(0); }\n";
15386 char const *fsSource =
15387 "#version 450\n"
15388 "\n"
15389 "layout(set=0, binding=0) uniform sampler3D s;\n"
15390 "layout(location=0) out vec4 color;\n"
15391 "void main() {\n"
15392 " color = texture(s, vec3(0));\n"
15393 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15395 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15396
15397 VkPipelineObj pipe(m_device);
15398 pipe.AddShader(&vs);
15399 pipe.AddShader(&fs);
15400 pipe.AddColorAttachment();
15401
15402 VkTextureObj texture(m_device, nullptr);
15403 VkSamplerObj sampler(m_device);
15404
15405 VkDescriptorSetObj descriptorSet(m_device);
15406 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15407 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15408
15409 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15410 ASSERT_VK_SUCCESS(err);
15411
Tony Barbour552f6c02016-12-21 14:34:07 -070015412 m_commandBuffer->BeginCommandBuffer();
15413 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015414
15415 m_commandBuffer->BindPipeline(pipe);
15416 m_commandBuffer->BindDescriptorSet(descriptorSet);
15417
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015418 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015419 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015420 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015421 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15422
15423 // error produced here.
15424 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15425
15426 m_errorMonitor->VerifyFound();
15427
Tony Barbour552f6c02016-12-21 14:34:07 -070015428 m_commandBuffer->EndRenderPass();
15429 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015430}
15431
Chris Forbes5533bfc2016-07-27 14:12:34 +120015432TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015433 TEST_DESCRIPTION(
15434 "Test that an error is produced when a multisampled images "
15435 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015436
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015438
Tony Barbour1fa09702017-03-16 12:09:08 -060015439 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15441
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015442 char const *vsSource =
15443 "#version 450\n"
15444 "\n"
15445 "out gl_PerVertex { vec4 gl_Position; };\n"
15446 "void main() { gl_Position = vec4(0); }\n";
15447 char const *fsSource =
15448 "#version 450\n"
15449 "\n"
15450 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15451 "layout(location=0) out vec4 color;\n"
15452 "void main() {\n"
15453 " color = texelFetch(s, ivec2(0), 0);\n"
15454 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15457
15458 VkPipelineObj pipe(m_device);
15459 pipe.AddShader(&vs);
15460 pipe.AddShader(&fs);
15461 pipe.AddColorAttachment();
15462
15463 VkTextureObj texture(m_device, nullptr);
15464 VkSamplerObj sampler(m_device);
15465
15466 VkDescriptorSetObj descriptorSet(m_device);
15467 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15468 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15469
15470 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15471 ASSERT_VK_SUCCESS(err);
15472
Tony Barbour552f6c02016-12-21 14:34:07 -070015473 m_commandBuffer->BeginCommandBuffer();
15474 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015475
15476 m_commandBuffer->BindPipeline(pipe);
15477 m_commandBuffer->BindDescriptorSet(descriptorSet);
15478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015479 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015480 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015481 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015482 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15483
15484 // error produced here.
15485 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15486
15487 m_errorMonitor->VerifyFound();
15488
Tony Barbour552f6c02016-12-21 14:34:07 -070015489 m_commandBuffer->EndRenderPass();
15490 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015491}
15492
Mark Youngc48c4c12016-04-11 14:26:49 -060015493TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015494 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015495
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015496 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15497 {
15498 VkFormatProperties properties;
15499 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15500 if (properties.optimalTilingFeatures == 0) {
15501 printf(" Image format not supported; skipped.\n");
15502 return;
15503 }
15504 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015505
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015506 VkImageCreateInfo info = {};
15507 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15508 info.pNext = NULL;
15509 info.imageType = VK_IMAGE_TYPE_2D;
15510 info.format = format;
15511 info.extent.height = 32;
15512 info.extent.depth = 1;
15513 info.mipLevels = 1;
15514 info.arrayLayers = 1;
15515 info.samples = VK_SAMPLE_COUNT_1_BIT;
15516 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15517 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15518 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015519
15520 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015521 {
15522 VkImageFormatProperties properties;
15523 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15524 info.tiling, info.usage, info.flags, &properties);
15525 ASSERT_VK_SUCCESS(result);
15526 info.extent.width = properties.maxExtent.width + 1;
15527 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015528
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015529 VkImage image;
15530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15531 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015532 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015533}
15534
Mark Youngc48c4c12016-04-11 14:26:49 -060015535TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015536 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015537
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015538 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15539 {
15540 VkFormatProperties properties;
15541 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15542 if (properties.optimalTilingFeatures == 0) {
15543 printf(" Image format not supported; skipped.\n");
15544 return;
15545 }
15546 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015547
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015548 VkImageCreateInfo info = {};
15549 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15550 info.pNext = NULL;
15551 info.imageType = VK_IMAGE_TYPE_2D;
15552 info.format = format;
15553 info.extent.height = 32;
15554 info.extent.depth = 1;
15555 info.mipLevels = 1;
15556 info.arrayLayers = 1;
15557 info.samples = VK_SAMPLE_COUNT_1_BIT;
15558 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15559 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15560 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015561
15562 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015563 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015564
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015565 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015567 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15568 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015569 m_errorMonitor->VerifyFound();
15570}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015571
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015572TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015573 TEST_DESCRIPTION(
15574 "Create a render pass with an attachment description "
15575 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015576
Tony Barbour1fa09702017-03-16 12:09:08 -060015577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15579
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015581
15582 VkAttachmentReference color_attach = {};
15583 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15584 color_attach.attachment = 0;
15585 VkSubpassDescription subpass = {};
15586 subpass.colorAttachmentCount = 1;
15587 subpass.pColorAttachments = &color_attach;
15588
15589 VkRenderPassCreateInfo rpci = {};
15590 rpci.subpassCount = 1;
15591 rpci.pSubpasses = &subpass;
15592 rpci.attachmentCount = 1;
15593 VkAttachmentDescription attach_desc = {};
15594 attach_desc.format = VK_FORMAT_UNDEFINED;
15595 rpci.pAttachments = &attach_desc;
15596 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15597 VkRenderPass rp;
15598 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15599
15600 m_errorMonitor->VerifyFound();
15601
15602 if (result == VK_SUCCESS) {
15603 vkDestroyRenderPass(m_device->device(), rp, NULL);
15604 }
15605}
15606
Karl Schultz6addd812016-02-02 17:17:23 -070015607TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015608 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015609
Mike Stroyana3082432015-09-25 13:39:21 -060015610 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015611 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15612 const int32_t tex_width = 32;
15613 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015614
15615 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015616 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15617 image_create_info.pNext = NULL;
15618 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15619 image_create_info.format = tex_format;
15620 image_create_info.extent.width = tex_width;
15621 image_create_info.extent.height = tex_height;
15622 image_create_info.extent.depth = 1;
15623 image_create_info.mipLevels = 1;
15624 image_create_info.arrayLayers = 1;
15625 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15626 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15627 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15628 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015629
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015630 VkImage image;
15631 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015632 ASSERT_VK_SUCCESS(err);
15633
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015634 VkMemoryRequirements requirements;
15635 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15636
15637 VkMemoryAllocateInfo alloc_info{};
15638 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15639 alloc_info.pNext = NULL;
15640 alloc_info.memoryTypeIndex = 0;
15641 alloc_info.allocationSize = requirements.size;
15642 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15643 ASSERT_TRUE(pass);
15644
15645 VkDeviceMemory memory;
15646 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15647 ASSERT_VK_SUCCESS(err);
15648
15649 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15650
Tobin Ehliscde08892015-09-22 10:11:37 -060015651 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015652 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015653 image_view_create_info.image = image;
15654 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15655 image_view_create_info.format = tex_format;
15656 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015657 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015658 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015659 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015660
15661 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015663 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015664 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015665
15666 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015667 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015668}
Mike Stroyana3082432015-09-25 13:39:21 -060015669
Mark Youngd339ba32016-05-30 13:28:35 -060015670TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15671 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015673 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015674
Tony Barbour1fa09702017-03-16 12:09:08 -060015675 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015676
15677 // Create an image and try to create a view with no memory backing the image
15678 VkImage image;
15679
15680 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15681 const int32_t tex_width = 32;
15682 const int32_t tex_height = 32;
15683
15684 VkImageCreateInfo image_create_info = {};
15685 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15686 image_create_info.pNext = NULL;
15687 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15688 image_create_info.format = tex_format;
15689 image_create_info.extent.width = tex_width;
15690 image_create_info.extent.height = tex_height;
15691 image_create_info.extent.depth = 1;
15692 image_create_info.mipLevels = 1;
15693 image_create_info.arrayLayers = 1;
15694 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15695 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15696 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15697 image_create_info.flags = 0;
15698
15699 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15700 ASSERT_VK_SUCCESS(err);
15701
15702 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015703 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015704 image_view_create_info.image = image;
15705 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15706 image_view_create_info.format = tex_format;
15707 image_view_create_info.subresourceRange.layerCount = 1;
15708 image_view_create_info.subresourceRange.baseMipLevel = 0;
15709 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015710 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015711
15712 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015713 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015714
15715 m_errorMonitor->VerifyFound();
15716 vkDestroyImage(m_device->device(), image, NULL);
15717 // If last error is success, it still created the view, so delete it.
15718 if (err == VK_SUCCESS) {
15719 vkDestroyImageView(m_device->device(), view, NULL);
15720 }
Mark Youngd339ba32016-05-30 13:28:35 -060015721}
15722
Karl Schultz6addd812016-02-02 17:17:23 -070015723TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015724 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015726
Tony Barbour1fa09702017-03-16 12:09:08 -060015727 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015728
Karl Schultz6addd812016-02-02 17:17:23 -070015729 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015730 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015731 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015732 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015733
15734 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015735 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015736 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015737 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15738 image_view_create_info.format = tex_format;
15739 image_view_create_info.subresourceRange.baseMipLevel = 0;
15740 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015741 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015742 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015743 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015744
15745 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015746 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015747
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015748 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015749}
15750
Mike Weiblena1e13f42017-02-09 21:25:59 -070015751TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15752 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15753
Tony Barbour1fa09702017-03-16 12:09:08 -060015754 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015755 VkSubresourceLayout subres_layout = {};
15756
15757 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15758 {
15759 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15760 VkImageObj img(m_device);
15761 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15762 ASSERT_TRUE(img.initialized());
15763
15764 VkImageSubresource subres = {};
15765 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15766 subres.mipLevel = 0;
15767 subres.arrayLayer = 0;
15768
15769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15770 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15771 m_errorMonitor->VerifyFound();
15772 }
15773
15774 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15775 {
15776 VkImageObj img(m_device);
15777 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15778 ASSERT_TRUE(img.initialized());
15779
15780 VkImageSubresource subres = {};
15781 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15782 subres.mipLevel = 0;
15783 subres.arrayLayer = 0;
15784
15785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15787 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15788 m_errorMonitor->VerifyFound();
15789 }
15790
15791 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15792 {
15793 VkImageObj img(m_device);
15794 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15795 ASSERT_TRUE(img.initialized());
15796
15797 VkImageSubresource subres = {};
15798 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15799 subres.mipLevel = 1; // ERROR: triggers VU 00739
15800 subres.arrayLayer = 0;
15801
15802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15803 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15804 m_errorMonitor->VerifyFound();
15805 }
15806
15807 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15808 {
15809 VkImageObj img(m_device);
15810 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15811 ASSERT_TRUE(img.initialized());
15812
15813 VkImageSubresource subres = {};
15814 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15815 subres.mipLevel = 0;
15816 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15817
15818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15819 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15820 m_errorMonitor->VerifyFound();
15821 }
15822}
15823
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015824TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015825 VkResult err;
15826 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015827
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015829
Tony Barbour1fa09702017-03-16 12:09:08 -060015830 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015831
15832 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015833 VkImage srcImage;
15834 VkImage dstImage;
15835 VkDeviceMemory srcMem;
15836 VkDeviceMemory destMem;
15837 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015838
15839 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015840 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15841 image_create_info.pNext = NULL;
15842 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15843 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15844 image_create_info.extent.width = 32;
15845 image_create_info.extent.height = 32;
15846 image_create_info.extent.depth = 1;
15847 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015848 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015849 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15850 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15851 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15852 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015855 ASSERT_VK_SUCCESS(err);
15856
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015857 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015858 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015859 ASSERT_VK_SUCCESS(err);
15860
15861 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015862 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015863 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15864 memAlloc.pNext = NULL;
15865 memAlloc.allocationSize = 0;
15866 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015867
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015868 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015869 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015870 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015871 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015872 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015873 ASSERT_VK_SUCCESS(err);
15874
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015875 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015876 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015877 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015878 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015879 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015880 ASSERT_VK_SUCCESS(err);
15881
15882 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15883 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015884 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015885 ASSERT_VK_SUCCESS(err);
15886
Tony Barbour552f6c02016-12-21 14:34:07 -070015887 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015888 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015889 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015890 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015891 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015892 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015893 copyRegion.srcOffset.x = 0;
15894 copyRegion.srcOffset.y = 0;
15895 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015896 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015897 copyRegion.dstSubresource.mipLevel = 0;
15898 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015899 // Introduce failure by forcing the dst layerCount to differ from src
15900 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015901 copyRegion.dstOffset.x = 0;
15902 copyRegion.dstOffset.y = 0;
15903 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015904 copyRegion.extent.width = 1;
15905 copyRegion.extent.height = 1;
15906 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015907 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015908 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015909
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015910 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015911
Chia-I Wuf7458c52015-10-26 21:10:41 +080015912 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015913 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015914 vkFreeMemory(m_device->device(), srcMem, NULL);
15915 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015916}
15917
Tony Barbourd6673642016-05-05 14:46:39 -060015918TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015919 TEST_DESCRIPTION("Creating images with unsuported formats ");
15920
Tony Barbour1fa09702017-03-16 12:09:08 -060015921 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015923
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015924 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015925 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015926 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015927 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15928 image_create_info.format = VK_FORMAT_UNDEFINED;
15929 image_create_info.extent.width = 32;
15930 image_create_info.extent.height = 32;
15931 image_create_info.extent.depth = 1;
15932 image_create_info.mipLevels = 1;
15933 image_create_info.arrayLayers = 1;
15934 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15935 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15936 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15939 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015940
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015941 VkImage image;
15942 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015943 m_errorMonitor->VerifyFound();
15944
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015945 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015946 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015947 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15948 VkFormat format = static_cast<VkFormat>(f);
15949 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015950 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015951 unsupported = format;
15952 break;
15953 }
15954 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015955
Tony Barbourd6673642016-05-05 14:46:39 -060015956 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015957 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015959
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015960 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015961 m_errorMonitor->VerifyFound();
15962 }
15963}
15964
15965TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015966 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15967
Tony Barbour1fa09702017-03-16 12:09:08 -060015968 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060015969 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015970 if (!depth_format) {
15971 return;
15972 }
Tony Barbourd6673642016-05-05 14:46:39 -060015973
15974 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015975 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 -060015976 VK_IMAGE_TILING_OPTIMAL, 0);
15977 ASSERT_TRUE(image.initialized());
15978
15979 VkImageView imgView;
15980 VkImageViewCreateInfo imgViewInfo = {};
15981 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15982 imgViewInfo.image = image.handle();
15983 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15984 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15985 imgViewInfo.subresourceRange.layerCount = 1;
15986 imgViewInfo.subresourceRange.baseMipLevel = 0;
15987 imgViewInfo.subresourceRange.levelCount = 1;
15988 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15989
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015990 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015991 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015993 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15994 m_errorMonitor->VerifyFound();
15995 imgViewInfo.subresourceRange.baseMipLevel = 0;
15996
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015997 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015998 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016000 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16001 m_errorMonitor->VerifyFound();
16002 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16003
Tony Barbourd6673642016-05-05 14:46:39 -060016004 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16005 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016007 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16008 m_errorMonitor->VerifyFound();
16009 imgViewInfo.subresourceRange.levelCount = 1;
16010
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016011 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16012 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016013 m_errorMonitor->SetDesiredFailureMsg(
16014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16015 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016016 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16017 m_errorMonitor->VerifyFound();
16018 imgViewInfo.subresourceRange.layerCount = 1;
16019
Tony Barbourd6673642016-05-05 14:46:39 -060016020 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016021 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016022 m_errorMonitor->SetDesiredFailureMsg(
16023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16024 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016025 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16026 m_errorMonitor->VerifyFound();
16027 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16028
Tony Barbourd6673642016-05-05 14:46:39 -060016029 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16030 // VIEW_CREATE_ERROR
16031 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016033 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16034 m_errorMonitor->VerifyFound();
16035 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16036
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016037 // TODO: Update framework to easily passing mutable flag into ImageObj init
16038 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016039 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16040 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16041 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016042 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16043 // VIEW_CREATE_ERROR
16044 VkImageCreateInfo mutImgInfo = image.create_info();
16045 VkImage mutImage;
16046 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016047 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016048 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16049 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016050 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016051 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016052
16053 VkMemoryRequirements requirements;
16054 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16055
16056 VkMemoryAllocateInfo alloc_info{};
16057 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16058 alloc_info.pNext = NULL;
16059 alloc_info.memoryTypeIndex = 0;
16060 alloc_info.allocationSize = requirements.size;
16061 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16062 ASSERT_TRUE(pass);
16063
16064 VkDeviceMemory memory;
16065 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16066 ASSERT_VK_SUCCESS(ret);
16067
16068 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16069 ASSERT_VK_SUCCESS(ret);
16070
Tony Barbourd6673642016-05-05 14:46:39 -060016071 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016073 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16074 m_errorMonitor->VerifyFound();
16075 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016076
16077 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016078 vkDestroyImage(m_device->handle(), mutImage, NULL);
16079}
16080
Dave Houlton75967fc2017-03-06 17:21:16 -070016081TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16082 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16083
Tony Barbour1fa09702017-03-16 12:09:08 -060016084 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016085
Jamie Madill35127872017-03-15 16:17:46 -040016086 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016087 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16088 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16089 if (device_features.textureCompressionBC) {
16090 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16091 } else if (device_features.textureCompressionETC2) {
16092 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16093 } else if (device_features.textureCompressionASTC_LDR) {
16094 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16095 } else {
16096 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16097 return;
16098 }
16099
16100 VkImageCreateInfo ci;
16101 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16102 ci.pNext = NULL;
16103 ci.flags = 0;
16104 ci.imageType = VK_IMAGE_TYPE_2D;
16105 ci.format = compressed_format;
16106 ci.extent = {32, 32, 1};
16107 ci.mipLevels = 6;
16108 ci.arrayLayers = 1;
16109 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16110 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16111 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16112 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16113 ci.queueFamilyIndexCount = 0;
16114 ci.pQueueFamilyIndices = NULL;
16115 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16116
16117 VkImageObj image(m_device);
16118 image.init(&ci);
16119 ASSERT_TRUE(image.initialized());
16120
16121 VkImageObj odd_image(m_device);
16122 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16123 odd_image.init(&ci);
16124 ASSERT_TRUE(odd_image.initialized());
16125
16126 // Allocate buffers
16127 VkMemoryPropertyFlags reqs = 0;
16128 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16129 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16130 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16131 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16132 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16133
16134 VkBufferImageCopy region = {};
16135 region.bufferRowLength = 0;
16136 region.bufferImageHeight = 0;
16137 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16138 region.imageSubresource.layerCount = 1;
16139 region.imageOffset = {0, 0, 0};
16140 region.bufferOffset = 0;
16141
16142 // start recording
16143 m_commandBuffer->BeginCommandBuffer();
16144
16145 // Mip level copies that work - 5 levels
16146 m_errorMonitor->ExpectSuccess();
16147
16148 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16149 region.imageExtent = {32, 32, 1};
16150 region.imageSubresource.mipLevel = 0;
16151 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16152 &region);
16153 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16154 &region);
16155
16156 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16157 region.imageExtent = {8, 8, 1};
16158 region.imageSubresource.mipLevel = 2;
16159 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16160 &region);
16161 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16162 &region);
16163
16164 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16165 region.imageExtent = {4, 4, 1};
16166 region.imageSubresource.mipLevel = 3;
16167 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16168 &region);
16169 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16170 &region);
16171
16172 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16173 region.imageExtent = {2, 2, 1};
16174 region.imageSubresource.mipLevel = 4;
16175 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16176 &region);
16177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16178 &region);
16179
16180 region.imageExtent = {1, 1, 1};
16181 region.imageSubresource.mipLevel = 5;
16182 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16183 &region);
16184 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16185 &region);
16186 m_errorMonitor->VerifyNotFound();
16187
16188 // Buffer must accomodate a full compressed block, regardless of texel count
16189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16190 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16191 &region);
16192 m_errorMonitor->VerifyFound();
16193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16194 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16195 &region);
16196 m_errorMonitor->VerifyFound();
16197
16198 // Copy width < compressed block size, but not the full mip width
16199 region.imageExtent = {1, 2, 1};
16200 region.imageSubresource.mipLevel = 4;
16201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16202 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16203 &region);
16204 m_errorMonitor->VerifyFound();
16205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16206 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16207 &region);
16208 m_errorMonitor->VerifyFound();
16209
16210 // Copy height < compressed block size but not the full mip height
16211 region.imageExtent = {2, 1, 1};
16212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16213 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16214 &region);
16215 m_errorMonitor->VerifyFound();
16216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16217 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16218 &region);
16219 m_errorMonitor->VerifyFound();
16220
16221 // Offsets must be multiple of compressed block size
16222 region.imageOffset = {1, 1, 0};
16223 region.imageExtent = {1, 1, 1};
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16225 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16226 &region);
16227 m_errorMonitor->VerifyFound();
16228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16229 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16230 &region);
16231 m_errorMonitor->VerifyFound();
16232
16233 // Offset + extent width = mip width - should succeed
16234 region.imageOffset = {4, 4, 0};
16235 region.imageExtent = {3, 4, 1};
16236 region.imageSubresource.mipLevel = 2;
16237 m_errorMonitor->ExpectSuccess();
16238 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16239 &region);
16240 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16241 &region);
16242 m_errorMonitor->VerifyNotFound();
16243
16244 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16245 region.imageExtent = {4, 4, 1};
16246 m_errorMonitor->ExpectSuccess();
16247 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16248 &region);
16249 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16250 &region);
16251 m_errorMonitor->VerifyNotFound();
16252
16253 // Offset + extent width < mip width and not a multiple of block width - should fail
16254 region.imageExtent = {3, 3, 1};
16255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16256 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16257 &region);
16258 m_errorMonitor->VerifyFound();
16259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16260 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16261 &region);
16262 m_errorMonitor->VerifyFound();
16263}
16264
Dave Houlton59a20702017-02-02 17:26:23 -070016265TEST_F(VkLayerTest, ImageBufferCopyTests) {
16266 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16267
Tony Barbour1fa09702017-03-16 12:09:08 -060016268 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016269 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16270 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16271 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16272 return;
16273 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016274
16275 // Bail if any dimension of transfer granularity is 0.
16276 auto index = m_device->graphics_queue_node_index_;
16277 auto queue_family_properties = m_device->phy().queue_properties();
16278 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16279 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16280 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16281 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16282 return;
16283 }
16284
Dave Houlton59a20702017-02-02 17:26:23 -070016285 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16286 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16287 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016288 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16289 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16290 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16291 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16292
Dave Houlton59a20702017-02-02 17:26:23 -070016293 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16294 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16295 VK_IMAGE_TILING_OPTIMAL, 0);
16296 image_16k.init(64, 64, 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_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16300 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016301 ASSERT_TRUE(image_64k.initialized());
16302 ASSERT_TRUE(image_16k.initialized());
16303 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016304
Dave Houltonf3229d52017-02-21 15:59:08 -070016305 // Verify all needed Depth/Stencil formats are supported
16306 bool missing_ds_support = false;
16307 VkFormatProperties props = {0, 0, 0};
16308 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16309 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16310 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16311 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16312 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16313 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16314 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16315 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16316
16317 if (!missing_ds_support) {
16318 ds_image_4D_1S.init(
16319 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16320 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16321 VK_IMAGE_TILING_OPTIMAL, 0);
16322 ASSERT_TRUE(ds_image_4D_1S.initialized());
16323
16324 ds_image_3D_1S.init(
16325 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16326 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16327 VK_IMAGE_TILING_OPTIMAL, 0);
16328 ASSERT_TRUE(ds_image_3D_1S.initialized());
16329
16330 ds_image_2D.init(
16331 256, 256, VK_FORMAT_D16_UNORM,
16332 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16333 VK_IMAGE_TILING_OPTIMAL, 0);
16334 ASSERT_TRUE(ds_image_2D.initialized());
16335
16336 ds_image_1S.init(
16337 256, 256, VK_FORMAT_S8_UINT,
16338 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16339 VK_IMAGE_TILING_OPTIMAL, 0);
16340 ASSERT_TRUE(ds_image_1S.initialized());
16341 }
16342
16343 // Allocate buffers
16344 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016345 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016346 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16347 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16348 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16349 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016350
16351 VkBufferImageCopy region = {};
16352 region.bufferRowLength = 0;
16353 region.bufferImageHeight = 0;
16354 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16355 region.imageSubresource.layerCount = 1;
16356 region.imageOffset = {0, 0, 0};
16357 region.imageExtent = {64, 64, 1};
16358 region.bufferOffset = 0;
16359
16360 // attempt copies before putting command buffer in recording state
16361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16362 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16363 &region);
16364 m_errorMonitor->VerifyFound();
16365
16366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16368 &region);
16369 m_errorMonitor->VerifyFound();
16370
16371 // start recording
16372 m_commandBuffer->BeginCommandBuffer();
16373
16374 // successful copies
16375 m_errorMonitor->ExpectSuccess();
16376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16377 &region);
16378 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16379 &region);
16380 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16381 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16382 &region);
16383 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16385 &region);
16386 region.imageOffset.x = 0;
16387 region.imageExtent.height = 64;
16388 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16389 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16390 &region);
16391 m_errorMonitor->VerifyNotFound();
16392
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016393 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016394 region.imageExtent = {65, 64, 1};
16395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16396 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16397 &region);
16398 m_errorMonitor->VerifyFound();
16399
16400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16401 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16402 &region);
16403 m_errorMonitor->VerifyFound();
16404
16405 // image/buffer too small (offset) on copy to image
16406 region.imageExtent = {64, 64, 1};
16407 region.imageOffset = {0, 4, 0};
16408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16409 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16410 &region);
16411 m_errorMonitor->VerifyFound();
16412
16413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16414 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16415 &region);
16416 m_errorMonitor->VerifyFound();
16417
16418 // image/buffer too small on copy to buffer
16419 region.imageExtent = {64, 64, 1};
16420 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016421 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16423 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16424 &region);
16425 m_errorMonitor->VerifyFound();
16426
16427 region.imageExtent = {64, 65, 1};
16428 region.bufferOffset = 0;
16429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16430 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16431 &region);
16432 m_errorMonitor->VerifyFound();
16433
16434 // buffer size ok but rowlength causes loose packing
16435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16436 region.imageExtent = {64, 64, 1};
16437 region.bufferRowLength = 68;
16438 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016442 // An extent with zero area should produce a warning, but no error
16443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16444 region.imageExtent.width = 0;
16445 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16446 &region);
16447 m_errorMonitor->VerifyFound();
16448
Dave Houlton59a20702017-02-02 17:26:23 -070016449 // aspect bits
16450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16451 region.imageExtent = {64, 64, 1};
16452 region.bufferRowLength = 0;
16453 region.bufferImageHeight = 0;
16454 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16455 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16456 buffer_16k.handle(), 1, &region);
16457 m_errorMonitor->VerifyFound();
16458
16459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16460 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16461 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16462 &region);
16463 m_errorMonitor->VerifyFound();
16464
16465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16466 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16467 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16468 buffer_16k.handle(), 1, &region);
16469 m_errorMonitor->VerifyFound();
16470
Dave Houltonf3229d52017-02-21 15:59:08 -070016471 // Test Depth/Stencil copies
16472 if (missing_ds_support) {
16473 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16474 } else {
16475 VkBufferImageCopy ds_region = {};
16476 ds_region.bufferOffset = 0;
16477 ds_region.bufferRowLength = 0;
16478 ds_region.bufferImageHeight = 0;
16479 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16480 ds_region.imageSubresource.mipLevel = 0;
16481 ds_region.imageSubresource.baseArrayLayer = 0;
16482 ds_region.imageSubresource.layerCount = 1;
16483 ds_region.imageOffset = {0, 0, 0};
16484 ds_region.imageExtent = {256, 256, 1};
16485
16486 // Depth copies that should succeed
16487 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16488 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16489 buffer_256k.handle(), 1, &ds_region);
16490 m_errorMonitor->VerifyNotFound();
16491
16492 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16493 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16494 buffer_256k.handle(), 1, &ds_region);
16495 m_errorMonitor->VerifyNotFound();
16496
16497 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16498 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16499 buffer_128k.handle(), 1, &ds_region);
16500 m_errorMonitor->VerifyNotFound();
16501
16502 // Depth copies that should fail
16503 ds_region.bufferOffset = 4;
16504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16505 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16506 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16507 buffer_256k.handle(), 1, &ds_region);
16508 m_errorMonitor->VerifyFound();
16509
16510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16511 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16512 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16513 buffer_256k.handle(), 1, &ds_region);
16514 m_errorMonitor->VerifyFound();
16515
16516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16517 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16518 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16519 buffer_128k.handle(), 1, &ds_region);
16520 m_errorMonitor->VerifyFound();
16521
16522 // Stencil copies that should succeed
16523 ds_region.bufferOffset = 0;
16524 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16525 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16526 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16527 buffer_64k.handle(), 1, &ds_region);
16528 m_errorMonitor->VerifyNotFound();
16529
16530 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16531 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16532 buffer_64k.handle(), 1, &ds_region);
16533 m_errorMonitor->VerifyNotFound();
16534
16535 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16536 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16537 buffer_64k.handle(), 1, &ds_region);
16538 m_errorMonitor->VerifyNotFound();
16539
16540 // Stencil copies that should fail
16541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16542 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16543 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16544 buffer_16k.handle(), 1, &ds_region);
16545 m_errorMonitor->VerifyFound();
16546
16547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16548 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16549 ds_region.bufferRowLength = 260;
16550 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16551 buffer_64k.handle(), 1, &ds_region);
16552 m_errorMonitor->VerifyFound();
16553
16554 ds_region.bufferRowLength = 0;
16555 ds_region.bufferOffset = 4;
16556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16557 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16558 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16559 buffer_64k.handle(), 1, &ds_region);
16560 m_errorMonitor->VerifyFound();
16561 }
16562
Dave Houlton584d51e2017-02-16 12:52:54 -070016563 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016564 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016565 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016566 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16567 device_features.textureCompressionASTC_LDR)) {
16568 printf(" No compressed formats supported - block compression tests skipped.\n");
16569 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016570 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16571 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016572 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016573 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 -070016574 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16575 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016576 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016577 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 -070016578 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016579 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16580 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016581 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016582 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16583 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016584 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16585 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016586 }
16587 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016588
Dave Houlton584d51e2017-02-16 12:52:54 -070016589 // Just fits
16590 m_errorMonitor->ExpectSuccess();
16591 region.imageExtent = {128, 128, 1};
16592 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16593 buffer_16k.handle(), 1, &region);
16594 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016595
Dave Houlton584d51e2017-02-16 12:52:54 -070016596 // with offset, too big for buffer
16597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16598 region.bufferOffset = 16;
16599 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16600 buffer_16k.handle(), 1, &region);
16601 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016602 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016603
Dave Houlton67e9b532017-03-02 17:00:10 -070016604 // extents that are not a multiple of compressed block size
16605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16606 region.imageExtent.width = 66;
16607 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16608 buffer_16k.handle(), 1, &region);
16609 m_errorMonitor->VerifyFound();
16610 region.imageExtent.width = 128;
16611
16612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016613 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016614 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16615 buffer_16k.handle(), 1, &region);
16616 m_errorMonitor->VerifyFound();
16617 region.imageExtent.height = 128;
16618
16619 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16620
16621 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16622 m_errorMonitor->ExpectSuccess();
16623 region.imageExtent.width = 66;
16624 region.imageOffset.x = 64;
16625 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16626 buffer_16k.handle(), 1, &region);
16627 region.imageExtent.width = 16;
16628 region.imageOffset.x = 0;
16629 region.imageExtent.height = 2;
16630 region.imageOffset.y = 128;
16631 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016632 buffer_16k.handle(), 1, &region);
16633 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016634 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016635
Dave Houlton584d51e2017-02-16 12:52:54 -070016636 // buffer offset must be a multiple of texel block size (16)
16637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16639 region.imageExtent = {64, 64, 1};
16640 region.bufferOffset = 24;
16641 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16642 buffer_16k.handle(), 1, &region);
16643 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016644
Dave Houlton584d51e2017-02-16 12:52:54 -070016645 // rowlength not a multiple of block width (4)
16646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16647 region.bufferOffset = 0;
16648 region.bufferRowLength = 130;
16649 region.bufferImageHeight = 0;
16650 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16651 buffer_64k.handle(), 1, &region);
16652 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016653
Dave Houlton584d51e2017-02-16 12:52:54 -070016654 // imageheight not a multiple of block height (4)
16655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16656 region.bufferRowLength = 0;
16657 region.bufferImageHeight = 130;
16658 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16659 buffer_64k.handle(), 1, &region);
16660 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016661 }
Dave Houlton59a20702017-02-02 17:26:23 -070016662}
16663
Tony Barbourd6673642016-05-05 14:46:39 -060016664TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016665 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016666
Tony Barbour1fa09702017-03-16 12:09:08 -060016667 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016668
Rene Lindsay135204f2016-12-22 17:11:09 -070016669 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016670 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016671 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 -070016672 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016673 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016674 vk_testing::Buffer buffer;
16675 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016676 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016677 VkBufferImageCopy region = {};
16678 region.bufferRowLength = 128;
16679 region.bufferImageHeight = 128;
16680 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16681 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016682 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016683 region.imageExtent.height = 4;
16684 region.imageExtent.width = 4;
16685 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016686
16687 VkImageObj image2(m_device);
16688 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 -070016689 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016690 ASSERT_TRUE(image2.initialized());
16691 vk_testing::Buffer buffer2;
16692 VkMemoryPropertyFlags reqs2 = 0;
16693 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16694 VkBufferImageCopy region2 = {};
16695 region2.bufferRowLength = 128;
16696 region2.bufferImageHeight = 128;
16697 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16698 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16699 region2.imageSubresource.layerCount = 1;
16700 region2.imageExtent.height = 4;
16701 region2.imageExtent.width = 4;
16702 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016703 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016704
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016705 // Image must have offset.z of 0 and extent.depth of 1
16706 // Introduce failure by setting imageExtent.depth to 0
16707 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016709 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016710 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016711 m_errorMonitor->VerifyFound();
16712
16713 region.imageExtent.depth = 1;
16714
16715 // Image must have offset.z of 0 and extent.depth of 1
16716 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016717 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016718 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016721 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016722 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016723 m_errorMonitor->VerifyFound();
16724
16725 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016726 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16727 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016728 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016730 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16731 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016732 m_errorMonitor->VerifyFound();
16733
16734 // BufferOffset must be a multiple of 4
16735 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016736 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016738 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16739 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016740 m_errorMonitor->VerifyFound();
16741
16742 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16743 region.bufferOffset = 0;
16744 region.imageExtent.height = 128;
16745 region.imageExtent.width = 128;
16746 // Introduce failure by setting bufferRowLength > 0 but less than width
16747 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016749 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16750 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016751 m_errorMonitor->VerifyFound();
16752
16753 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16754 region.bufferRowLength = 128;
16755 // Introduce failure by setting bufferRowHeight > 0 but less than height
16756 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016758 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16759 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016760 m_errorMonitor->VerifyFound();
16761
16762 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016763 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016764 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16765 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016766 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016767 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16768 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016769 VkImageBlit blitRegion = {};
16770 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16771 blitRegion.srcSubresource.baseArrayLayer = 0;
16772 blitRegion.srcSubresource.layerCount = 1;
16773 blitRegion.srcSubresource.mipLevel = 0;
16774 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16775 blitRegion.dstSubresource.baseArrayLayer = 0;
16776 blitRegion.dstSubresource.layerCount = 1;
16777 blitRegion.dstSubresource.mipLevel = 0;
16778
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016779 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16781 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16783 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016784 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16785 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016786 m_errorMonitor->VerifyFound();
16787
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016789 VkImageMemoryBarrier img_barrier;
16790 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16791 img_barrier.pNext = NULL;
16792 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16793 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16794 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16795 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16796 img_barrier.image = image.handle();
16797 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16798 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16799 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16800 img_barrier.subresourceRange.baseArrayLayer = 0;
16801 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016802 img_barrier.subresourceRange.layerCount = 0;
16803 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016804 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16805 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016806 m_errorMonitor->VerifyFound();
16807 img_barrier.subresourceRange.layerCount = 1;
16808}
16809
16810TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016811 TEST_DESCRIPTION("Exceed the limits of image format ");
16812
Tony Barbour1fa09702017-03-16 12:09:08 -060016813 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016814
16815 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16816 {
16817 VkFormatProperties properties;
16818 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16819 if (properties.linearTilingFeatures == 0) {
16820 printf(" Image format not supported; skipped.\n");
16821 return;
16822 }
16823 }
16824
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016826 VkImageCreateInfo image_create_info = {};
16827 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16828 image_create_info.pNext = NULL;
16829 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016830 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016831 image_create_info.extent.width = 32;
16832 image_create_info.extent.height = 32;
16833 image_create_info.extent.depth = 1;
16834 image_create_info.mipLevels = 1;
16835 image_create_info.arrayLayers = 1;
16836 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16837 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16838 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16839 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16840 image_create_info.flags = 0;
16841
16842 VkImage nullImg;
16843 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016844 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16845 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016846 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016847 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16848 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16849 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016850 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016851
Tony Barbour0907e362017-03-09 15:05:30 -070016852 uint32_t maxDim =
16853 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16854 // If max mip levels exceeds image extents, skip the max mip levels test
16855 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16857 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16858 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16859 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16860 m_errorMonitor->VerifyFound();
16861 image_create_info.mipLevels = 1;
16862 }
Tony Barbourd6673642016-05-05 14:46:39 -060016863
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016865 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16866 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16867 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16868 m_errorMonitor->VerifyFound();
16869 image_create_info.arrayLayers = 1;
16870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016872 int samples = imgFmtProps.sampleCounts >> 1;
16873 image_create_info.samples = (VkSampleCountFlagBits)samples;
16874 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16875 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16876 m_errorMonitor->VerifyFound();
16877 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16878
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16880 "pCreateInfo->initialLayout, must be "
16881 "VK_IMAGE_LAYOUT_UNDEFINED or "
16882 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016883 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16884 // Expect INVALID_LAYOUT
16885 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16886 m_errorMonitor->VerifyFound();
16887 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16888}
16889
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016890TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016891 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016893
Tony Barbour1fa09702017-03-16 12:09:08 -060016894 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016895
16896 VkImageObj src_image(m_device);
16897 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16898 VkImageObj dst_image(m_device);
16899 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16900
Tony Barbour552f6c02016-12-21 14:34:07 -070016901 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016902 VkImageCopy copy_region;
16903 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16904 copy_region.srcSubresource.mipLevel = 0;
16905 copy_region.srcSubresource.baseArrayLayer = 0;
16906 copy_region.srcSubresource.layerCount = 0;
16907 copy_region.srcOffset.x = 0;
16908 copy_region.srcOffset.y = 0;
16909 copy_region.srcOffset.z = 0;
16910 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16911 copy_region.dstSubresource.mipLevel = 0;
16912 copy_region.dstSubresource.baseArrayLayer = 0;
16913 copy_region.dstSubresource.layerCount = 0;
16914 copy_region.dstOffset.x = 0;
16915 copy_region.dstOffset.y = 0;
16916 copy_region.dstOffset.z = 0;
16917 copy_region.extent.width = 64;
16918 copy_region.extent.height = 64;
16919 copy_region.extent.depth = 1;
16920 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16921 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016922 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016923
16924 m_errorMonitor->VerifyFound();
16925}
16926
16927TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016928 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016930
Tony Barbour1fa09702017-03-16 12:09:08 -060016931 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016932
16933 VkImageObj src_image(m_device);
16934 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16935 VkImageObj dst_image(m_device);
16936 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16937
Tony Barbour552f6c02016-12-21 14:34:07 -070016938 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016939 VkImageCopy copy_region;
16940 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16941 copy_region.srcSubresource.mipLevel = 0;
16942 copy_region.srcSubresource.baseArrayLayer = 0;
16943 copy_region.srcSubresource.layerCount = 0;
16944 copy_region.srcOffset.x = 0;
16945 copy_region.srcOffset.y = 0;
16946 copy_region.srcOffset.z = 0;
16947 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16948 copy_region.dstSubresource.mipLevel = 0;
16949 copy_region.dstSubresource.baseArrayLayer = 0;
16950 copy_region.dstSubresource.layerCount = 0;
16951 copy_region.dstOffset.x = 0;
16952 copy_region.dstOffset.y = 0;
16953 copy_region.dstOffset.z = 0;
16954 copy_region.extent.width = 64;
16955 copy_region.extent.height = 64;
16956 copy_region.extent.depth = 1;
16957 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16958 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016959 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016960
16961 m_errorMonitor->VerifyFound();
16962}
16963
Karl Schultz6addd812016-02-02 17:17:23 -070016964TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016965 VkResult err;
16966 bool pass;
16967
16968 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016970
Tony Barbour1fa09702017-03-16 12:09:08 -060016971 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016972
16973 // Create two images of different types and try to copy between them
16974 VkImage srcImage;
16975 VkImage dstImage;
16976 VkDeviceMemory srcMem;
16977 VkDeviceMemory destMem;
16978 VkMemoryRequirements memReqs;
16979
16980 VkImageCreateInfo image_create_info = {};
16981 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16982 image_create_info.pNext = NULL;
16983 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16984 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16985 image_create_info.extent.width = 32;
16986 image_create_info.extent.height = 32;
16987 image_create_info.extent.depth = 1;
16988 image_create_info.mipLevels = 1;
16989 image_create_info.arrayLayers = 1;
16990 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16991 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16992 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16993 image_create_info.flags = 0;
16994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016996 ASSERT_VK_SUCCESS(err);
16997
16998 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16999 // Introduce failure by creating second image with a different-sized format.
17000 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17001
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017002 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017003 ASSERT_VK_SUCCESS(err);
17004
17005 // Allocate memory
17006 VkMemoryAllocateInfo memAlloc = {};
17007 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17008 memAlloc.pNext = NULL;
17009 memAlloc.allocationSize = 0;
17010 memAlloc.memoryTypeIndex = 0;
17011
17012 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17013 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017014 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017015 ASSERT_TRUE(pass);
17016 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17017 ASSERT_VK_SUCCESS(err);
17018
17019 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17020 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017021 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017022 ASSERT_TRUE(pass);
17023 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17024 ASSERT_VK_SUCCESS(err);
17025
17026 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17027 ASSERT_VK_SUCCESS(err);
17028 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17029 ASSERT_VK_SUCCESS(err);
17030
Tony Barbour552f6c02016-12-21 14:34:07 -070017031 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017032 VkImageCopy copyRegion;
17033 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17034 copyRegion.srcSubresource.mipLevel = 0;
17035 copyRegion.srcSubresource.baseArrayLayer = 0;
17036 copyRegion.srcSubresource.layerCount = 0;
17037 copyRegion.srcOffset.x = 0;
17038 copyRegion.srcOffset.y = 0;
17039 copyRegion.srcOffset.z = 0;
17040 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17041 copyRegion.dstSubresource.mipLevel = 0;
17042 copyRegion.dstSubresource.baseArrayLayer = 0;
17043 copyRegion.dstSubresource.layerCount = 0;
17044 copyRegion.dstOffset.x = 0;
17045 copyRegion.dstOffset.y = 0;
17046 copyRegion.dstOffset.z = 0;
17047 copyRegion.extent.width = 1;
17048 copyRegion.extent.height = 1;
17049 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017050 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017051 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017052
17053 m_errorMonitor->VerifyFound();
17054
17055 vkDestroyImage(m_device->device(), srcImage, NULL);
17056 vkDestroyImage(m_device->device(), dstImage, NULL);
17057 vkFreeMemory(m_device->device(), srcMem, NULL);
17058 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017059}
17060
Karl Schultz6addd812016-02-02 17:17:23 -070017061TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17062 VkResult err;
17063 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017064
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017065 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17067 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017068
Tony Barbour1fa09702017-03-16 12:09:08 -060017069 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017070 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017071 if (!depth_format) {
17072 return;
17073 }
Mike Stroyana3082432015-09-25 13:39:21 -060017074
17075 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017076 VkImage srcImage;
17077 VkImage dstImage;
17078 VkDeviceMemory srcMem;
17079 VkDeviceMemory destMem;
17080 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017081
17082 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017083 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17084 image_create_info.pNext = NULL;
17085 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017086 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017087 image_create_info.extent.width = 32;
17088 image_create_info.extent.height = 32;
17089 image_create_info.extent.depth = 1;
17090 image_create_info.mipLevels = 1;
17091 image_create_info.arrayLayers = 1;
17092 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17093 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17094 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17095 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017097 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017098 ASSERT_VK_SUCCESS(err);
17099
Karl Schultzbdb75952016-04-19 11:36:49 -060017100 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17101
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017102 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017103 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017104 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017105 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017106
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017107 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017108 ASSERT_VK_SUCCESS(err);
17109
17110 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017111 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017112 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17113 memAlloc.pNext = NULL;
17114 memAlloc.allocationSize = 0;
17115 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017116
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017117 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017118 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017119 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017120 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017121 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017122 ASSERT_VK_SUCCESS(err);
17123
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017124 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017125 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017126 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017127 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017128 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017129 ASSERT_VK_SUCCESS(err);
17130
17131 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17132 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017133 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017134 ASSERT_VK_SUCCESS(err);
17135
Tony Barbour552f6c02016-12-21 14:34:07 -070017136 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017137 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017138 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017139 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017140 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017141 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017142 copyRegion.srcOffset.x = 0;
17143 copyRegion.srcOffset.y = 0;
17144 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017145 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017146 copyRegion.dstSubresource.mipLevel = 0;
17147 copyRegion.dstSubresource.baseArrayLayer = 0;
17148 copyRegion.dstSubresource.layerCount = 0;
17149 copyRegion.dstOffset.x = 0;
17150 copyRegion.dstOffset.y = 0;
17151 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017152 copyRegion.extent.width = 1;
17153 copyRegion.extent.height = 1;
17154 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017155 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017156 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017157
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017158 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017159
Chia-I Wuf7458c52015-10-26 21:10:41 +080017160 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017161 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017162 vkFreeMemory(m_device->device(), srcMem, NULL);
17163 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017164}
17165
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017166TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17167 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017168
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017169 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017170
17171 VkImageFormatProperties image_format_properties;
17172 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17173 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17174 &image_format_properties);
17175
17176 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17177 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17178 printf(" Image multi-sample support not found; skipped.\n");
17179 return;
17180 }
17181
17182 VkImageCreateInfo ci;
17183 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17184 ci.pNext = NULL;
17185 ci.flags = 0;
17186 ci.imageType = VK_IMAGE_TYPE_2D;
17187 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17188 ci.extent = {128, 128, 1};
17189 ci.mipLevels = 1;
17190 ci.arrayLayers = 1;
17191 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17192 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17193 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17194 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17195 ci.queueFamilyIndexCount = 0;
17196 ci.pQueueFamilyIndices = NULL;
17197 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17198
17199 VkImageObj image1(m_device);
17200 image1.init(&ci);
17201 ASSERT_TRUE(image1.initialized());
17202
17203 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17204 VkImageObj image2(m_device);
17205 image2.init(&ci);
17206 ASSERT_TRUE(image2.initialized());
17207
17208 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17209 VkImageObj image4(m_device);
17210 image4.init(&ci);
17211 ASSERT_TRUE(image4.initialized());
17212
17213 m_commandBuffer->BeginCommandBuffer();
17214
17215 VkImageCopy copyRegion;
17216 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17217 copyRegion.srcSubresource.mipLevel = 0;
17218 copyRegion.srcSubresource.baseArrayLayer = 0;
17219 copyRegion.srcSubresource.layerCount = 1;
17220 copyRegion.srcOffset = {0, 0, 0};
17221 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17222 copyRegion.dstSubresource.mipLevel = 0;
17223 copyRegion.dstSubresource.baseArrayLayer = 0;
17224 copyRegion.dstSubresource.layerCount = 1;
17225 copyRegion.dstOffset = {0, 0, 0};
17226 copyRegion.extent = {128, 128, 1};
17227
17228 // Copy a single sample image to/from a multi-sample image
17229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17230 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17231 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17232 m_errorMonitor->VerifyFound();
17233
17234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17235 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17236 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17237 m_errorMonitor->VerifyFound();
17238
17239 // Copy between multi-sample images with different sample counts
17240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17241 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17242 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17243 m_errorMonitor->VerifyFound();
17244
17245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17246 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17247 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17248 m_errorMonitor->VerifyFound();
17249
17250 m_commandBuffer->EndCommandBuffer();
17251}
17252
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017253TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17254 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017255 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017256 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017257 if (!ds_format) {
17258 return;
17259 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017260
17261 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17262 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17263 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 -060017264 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17265 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017266 ASSERT_TRUE(color_image.initialized());
17267 ASSERT_TRUE(depth_image.initialized());
17268 ASSERT_TRUE(ds_image.initialized());
17269
17270 VkImageCopy copyRegion;
17271 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17272 copyRegion.srcSubresource.mipLevel = 0;
17273 copyRegion.srcSubresource.baseArrayLayer = 0;
17274 copyRegion.srcSubresource.layerCount = 1;
17275 copyRegion.srcOffset = {0, 0, 0};
17276 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17277 copyRegion.dstSubresource.mipLevel = 0;
17278 copyRegion.dstSubresource.baseArrayLayer = 0;
17279 copyRegion.dstSubresource.layerCount = 1;
17280 copyRegion.dstOffset = {64, 0, 0};
17281 copyRegion.extent = {64, 128, 1};
17282
17283 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17285 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17286 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17287 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017288 m_errorMonitor->VerifyFound();
17289
17290 m_commandBuffer->BeginCommandBuffer();
17291
17292 // Src and dest aspect masks don't match
17293 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017295 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17296 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017297 m_errorMonitor->VerifyFound();
17298 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17299
17300 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017301 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17304 // These aspect/format mismatches are redundant but unavoidable here
17305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017307 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17308 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017309 m_errorMonitor->VerifyFound();
17310 // Metadata aspect is illegal - VU 01222
17311 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17312 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17314 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017315 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17316 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017317 m_errorMonitor->VerifyFound();
17318
17319 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17320 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17321
17322 // Aspect mask doesn't match source image format - VU 01200
17323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17324 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17326 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17327 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17328 m_errorMonitor->VerifyFound();
17329
17330 // Aspect mask doesn't match dest image format - VU 01201
17331 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17332 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17334 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17336 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17337 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17338 m_errorMonitor->VerifyFound();
17339
17340 m_commandBuffer->EndCommandBuffer();
17341}
17342
Karl Schultz6addd812016-02-02 17:17:23 -070017343TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17344 VkResult err;
17345 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017346
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17348 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017349
Tony Barbour1fa09702017-03-16 12:09:08 -060017350 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017351
17352 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017353 VkImage srcImage;
17354 VkImage dstImage;
17355 VkDeviceMemory srcMem;
17356 VkDeviceMemory destMem;
17357 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017358
17359 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017360 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17361 image_create_info.pNext = NULL;
17362 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17363 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17364 image_create_info.extent.width = 32;
17365 image_create_info.extent.height = 1;
17366 image_create_info.extent.depth = 1;
17367 image_create_info.mipLevels = 1;
17368 image_create_info.arrayLayers = 1;
17369 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17370 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17371 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17372 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017373
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017374 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017375 ASSERT_VK_SUCCESS(err);
17376
Karl Schultz6addd812016-02-02 17:17:23 -070017377 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017379 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017380 ASSERT_VK_SUCCESS(err);
17381
17382 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017383 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017384 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17385 memAlloc.pNext = NULL;
17386 memAlloc.allocationSize = 0;
17387 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017388
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017389 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017390 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017391 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017392 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017393 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017394 ASSERT_VK_SUCCESS(err);
17395
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017396 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017397 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017398 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017399 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017400 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017401 ASSERT_VK_SUCCESS(err);
17402
17403 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17404 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017405 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017406 ASSERT_VK_SUCCESS(err);
17407
Tony Barbour552f6c02016-12-21 14:34:07 -070017408 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017409 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017410 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17411 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017412 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017413 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017414 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017415 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017416 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017417 resolveRegion.srcOffset.x = 0;
17418 resolveRegion.srcOffset.y = 0;
17419 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017420 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017421 resolveRegion.dstSubresource.mipLevel = 0;
17422 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017423 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017424 resolveRegion.dstOffset.x = 0;
17425 resolveRegion.dstOffset.y = 0;
17426 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017427 resolveRegion.extent.width = 1;
17428 resolveRegion.extent.height = 1;
17429 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017430 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017431 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017432
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017433 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017434
Chia-I Wuf7458c52015-10-26 21:10:41 +080017435 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017436 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017437 vkFreeMemory(m_device->device(), srcMem, NULL);
17438 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017439}
17440
Karl Schultz6addd812016-02-02 17:17:23 -070017441TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17442 VkResult err;
17443 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017444
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17446 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017447
Tony Barbour1fa09702017-03-16 12:09:08 -060017448 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017449
Chris Forbesa7530692016-05-08 12:35:39 +120017450 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017451 VkImage srcImage;
17452 VkImage dstImage;
17453 VkDeviceMemory srcMem;
17454 VkDeviceMemory destMem;
17455 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017456
17457 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017458 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17459 image_create_info.pNext = NULL;
17460 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17461 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17462 image_create_info.extent.width = 32;
17463 image_create_info.extent.height = 1;
17464 image_create_info.extent.depth = 1;
17465 image_create_info.mipLevels = 1;
17466 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017467 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017468 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17469 // Note: Some implementations expect color attachment usage for any
17470 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017471 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017472 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017473
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017475 ASSERT_VK_SUCCESS(err);
17476
Karl Schultz6addd812016-02-02 17:17:23 -070017477 // Note: Some implementations expect color attachment usage for any
17478 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017479 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017480
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017481 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017482 ASSERT_VK_SUCCESS(err);
17483
17484 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017485 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017486 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17487 memAlloc.pNext = NULL;
17488 memAlloc.allocationSize = 0;
17489 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017490
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017491 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017492 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017493 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017494 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017495 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017496 ASSERT_VK_SUCCESS(err);
17497
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017498 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017499 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017500 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017501 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017502 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017503 ASSERT_VK_SUCCESS(err);
17504
17505 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017507 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017508 ASSERT_VK_SUCCESS(err);
17509
Tony Barbour552f6c02016-12-21 14:34:07 -070017510 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017511 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017512 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17513 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017514 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017515 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017516 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017517 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017518 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017519 resolveRegion.srcOffset.x = 0;
17520 resolveRegion.srcOffset.y = 0;
17521 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017522 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017523 resolveRegion.dstSubresource.mipLevel = 0;
17524 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017525 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017526 resolveRegion.dstOffset.x = 0;
17527 resolveRegion.dstOffset.y = 0;
17528 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017529 resolveRegion.extent.width = 1;
17530 resolveRegion.extent.height = 1;
17531 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017532 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017533 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017534
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017535 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017536
Chia-I Wuf7458c52015-10-26 21:10:41 +080017537 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017538 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017539 vkFreeMemory(m_device->device(), srcMem, NULL);
17540 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017541}
17542
Karl Schultz6addd812016-02-02 17:17:23 -070017543TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17544 VkResult err;
17545 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017546
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017548 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017549
Tony Barbour1fa09702017-03-16 12:09:08 -060017550 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017551
17552 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017553 VkImage srcImage;
17554 VkImage dstImage;
17555 VkDeviceMemory srcMem;
17556 VkDeviceMemory destMem;
17557 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017558
17559 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17561 image_create_info.pNext = NULL;
17562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17563 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17564 image_create_info.extent.width = 32;
17565 image_create_info.extent.height = 1;
17566 image_create_info.extent.depth = 1;
17567 image_create_info.mipLevels = 1;
17568 image_create_info.arrayLayers = 1;
17569 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17571 // Note: Some implementations expect color attachment usage for any
17572 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017573 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017574 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017576 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017577 ASSERT_VK_SUCCESS(err);
17578
Karl Schultz6addd812016-02-02 17:17:23 -070017579 // Set format to something other than source image
17580 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17581 // Note: Some implementations expect color attachment usage for any
17582 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017583 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017584 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017585
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017586 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017587 ASSERT_VK_SUCCESS(err);
17588
17589 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017590 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017591 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17592 memAlloc.pNext = NULL;
17593 memAlloc.allocationSize = 0;
17594 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017595
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017596 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017597 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017598 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017599 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017600 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017601 ASSERT_VK_SUCCESS(err);
17602
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017603 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017604 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017605 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017606 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017607 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017608 ASSERT_VK_SUCCESS(err);
17609
17610 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17611 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017612 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017613 ASSERT_VK_SUCCESS(err);
17614
Tony Barbour552f6c02016-12-21 14:34:07 -070017615 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017616 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017617 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17618 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017619 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017620 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017621 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017622 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017623 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017624 resolveRegion.srcOffset.x = 0;
17625 resolveRegion.srcOffset.y = 0;
17626 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017627 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017628 resolveRegion.dstSubresource.mipLevel = 0;
17629 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017630 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017631 resolveRegion.dstOffset.x = 0;
17632 resolveRegion.dstOffset.y = 0;
17633 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017634 resolveRegion.extent.width = 1;
17635 resolveRegion.extent.height = 1;
17636 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017637 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017638 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017639
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017640 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017641
Chia-I Wuf7458c52015-10-26 21:10:41 +080017642 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017643 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017644 vkFreeMemory(m_device->device(), srcMem, NULL);
17645 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017646}
17647
Karl Schultz6addd812016-02-02 17:17:23 -070017648TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17649 VkResult err;
17650 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017651
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017653 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017654
Tony Barbour1fa09702017-03-16 12:09:08 -060017655 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017656
17657 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017658 VkImage srcImage;
17659 VkImage dstImage;
17660 VkDeviceMemory srcMem;
17661 VkDeviceMemory destMem;
17662 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017663
17664 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017665 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17666 image_create_info.pNext = NULL;
17667 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17668 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17669 image_create_info.extent.width = 32;
17670 image_create_info.extent.height = 1;
17671 image_create_info.extent.depth = 1;
17672 image_create_info.mipLevels = 1;
17673 image_create_info.arrayLayers = 1;
17674 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17675 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17676 // Note: Some implementations expect color attachment usage for any
17677 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017678 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017679 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017680
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017681 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017682 ASSERT_VK_SUCCESS(err);
17683
Karl Schultz6addd812016-02-02 17:17:23 -070017684 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17685 // Note: Some implementations expect color attachment usage for any
17686 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017687 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017688 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017689
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017690 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017691 ASSERT_VK_SUCCESS(err);
17692
17693 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017694 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017695 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17696 memAlloc.pNext = NULL;
17697 memAlloc.allocationSize = 0;
17698 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017699
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017700 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017701 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017702 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017703 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017704 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017705 ASSERT_VK_SUCCESS(err);
17706
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017707 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017708 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017709 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017710 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017711 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017712 ASSERT_VK_SUCCESS(err);
17713
17714 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17715 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017716 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017717 ASSERT_VK_SUCCESS(err);
17718
Tony Barbour552f6c02016-12-21 14:34:07 -070017719 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017720 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017721 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17722 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017723 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017724 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017725 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017726 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017727 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017728 resolveRegion.srcOffset.x = 0;
17729 resolveRegion.srcOffset.y = 0;
17730 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017731 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017732 resolveRegion.dstSubresource.mipLevel = 0;
17733 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017734 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017735 resolveRegion.dstOffset.x = 0;
17736 resolveRegion.dstOffset.y = 0;
17737 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017738 resolveRegion.extent.width = 1;
17739 resolveRegion.extent.height = 1;
17740 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017741 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017742 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017743
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017744 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017745
Chia-I Wuf7458c52015-10-26 21:10:41 +080017746 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017747 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017748 vkFreeMemory(m_device->device(), srcMem, NULL);
17749 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017750}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017751
Karl Schultz6addd812016-02-02 17:17:23 -070017752TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017753 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017754 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17755 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017756 // The image format check comes 2nd in validation so we trigger it first,
17757 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017758 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017759
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17761 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017762
Tony Barbour1fa09702017-03-16 12:09:08 -060017763 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017764 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017765 if (!depth_format) {
17766 return;
17767 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017768
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017769 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017770 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17771 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017772
17773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17775 ds_pool_ci.pNext = NULL;
17776 ds_pool_ci.maxSets = 1;
17777 ds_pool_ci.poolSizeCount = 1;
17778 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017779
17780 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017781 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017782 ASSERT_VK_SUCCESS(err);
17783
17784 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017785 dsl_binding.binding = 0;
17786 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17787 dsl_binding.descriptorCount = 1;
17788 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17789 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017790
17791 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017792 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17793 ds_layout_ci.pNext = NULL;
17794 ds_layout_ci.bindingCount = 1;
17795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017796 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798 ASSERT_VK_SUCCESS(err);
17799
17800 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017801 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017802 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017803 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017804 alloc_info.descriptorPool = ds_pool;
17805 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017806 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017807 ASSERT_VK_SUCCESS(err);
17808
Karl Schultz6addd812016-02-02 17:17:23 -070017809 VkImage image_bad;
17810 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017811 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017812 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017813 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017814 const int32_t tex_width = 32;
17815 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017816
17817 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017818 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17819 image_create_info.pNext = NULL;
17820 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17821 image_create_info.format = tex_format_bad;
17822 image_create_info.extent.width = tex_width;
17823 image_create_info.extent.height = tex_height;
17824 image_create_info.extent.depth = 1;
17825 image_create_info.mipLevels = 1;
17826 image_create_info.arrayLayers = 1;
17827 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17828 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017829 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017830 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017831
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017833 ASSERT_VK_SUCCESS(err);
17834 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017835 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17836 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017837 ASSERT_VK_SUCCESS(err);
17838
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017839 // ---Bind image memory---
17840 VkMemoryRequirements img_mem_reqs;
17841 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17842 VkMemoryAllocateInfo image_alloc_info = {};
17843 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17844 image_alloc_info.pNext = NULL;
17845 image_alloc_info.memoryTypeIndex = 0;
17846 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017847 bool pass =
17848 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 -070017849 ASSERT_TRUE(pass);
17850 VkDeviceMemory mem;
17851 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17852 ASSERT_VK_SUCCESS(err);
17853 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17854 ASSERT_VK_SUCCESS(err);
17855 // -----------------------
17856
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017857 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017858 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017859 image_view_create_info.image = image_bad;
17860 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17861 image_view_create_info.format = tex_format_bad;
17862 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17863 image_view_create_info.subresourceRange.baseMipLevel = 0;
17864 image_view_create_info.subresourceRange.layerCount = 1;
17865 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017867
17868 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017869 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017870
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017871 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017872
Chia-I Wuf7458c52015-10-26 21:10:41 +080017873 vkDestroyImage(m_device->device(), image_bad, NULL);
17874 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017875 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17876 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017877
17878 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017879}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017880
17881TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017882 TEST_DESCRIPTION(
17883 "Call ClearColorImage w/ a depth|stencil image and "
17884 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017885
Tony Barbour1fa09702017-03-16 12:09:08 -060017886 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017887 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017888 if (!depth_format) {
17889 return;
17890 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17892
Tony Barbour552f6c02016-12-21 14:34:07 -070017893 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017894
17895 // Color image
17896 VkClearColorValue clear_color;
17897 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17898 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17899 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17900 const int32_t img_width = 32;
17901 const int32_t img_height = 32;
17902 VkImageCreateInfo image_create_info = {};
17903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17904 image_create_info.pNext = NULL;
17905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17906 image_create_info.format = color_format;
17907 image_create_info.extent.width = img_width;
17908 image_create_info.extent.height = img_height;
17909 image_create_info.extent.depth = 1;
17910 image_create_info.mipLevels = 1;
17911 image_create_info.arrayLayers = 1;
17912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17913 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17914 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17915
17916 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017917 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017918
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017920
17921 // Depth/Stencil image
17922 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017923 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017924 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17925 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017926 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017927 ds_image_create_info.extent.width = 64;
17928 ds_image_create_info.extent.height = 64;
17929 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017930 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 -060017931
17932 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017933 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017934
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 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 -060017936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017939 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017940 &color_range);
17941
17942 m_errorMonitor->VerifyFound();
17943
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17945 "vkCmdClearColorImage called with "
17946 "image created without "
17947 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017948
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017949 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017950 &color_range);
17951
17952 m_errorMonitor->VerifyFound();
17953
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017954 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17956 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017957
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017958 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17959 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017960
17961 m_errorMonitor->VerifyFound();
17962}
Tobin Ehliscde08892015-09-22 10:11:37 -060017963
Mike Schuchardt35fece12017-03-07 14:40:28 -070017964TEST_F(VkLayerTest, CommandQueueFlags) {
17965 TEST_DESCRIPTION(
17966 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17967 "graphics-only command");
17968
17969 ASSERT_NO_FATAL_FAILURE(Init());
17970
17971 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017972 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070017973 printf(" Non-graphics queue family not found; skipped.\n");
17974 return;
17975 } else {
17976 // Create command pool on a non-graphics queue
17977 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17978
17979 // Setup command buffer on pool
17980 VkCommandBufferObj command_buffer(m_device, &command_pool);
17981 command_buffer.BeginCommandBuffer();
17982
17983 // Issue a graphics only command
17984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17985 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17986 command_buffer.SetViewport(0, 1, &viewport);
17987 m_errorMonitor->VerifyFound();
17988 }
17989}
17990
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017991// WSI Enabled Tests
17992//
Chris Forbes09368e42016-10-13 11:59:22 +130017993#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017994TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17995
17996#if defined(VK_USE_PLATFORM_XCB_KHR)
17997 VkSurfaceKHR surface = VK_NULL_HANDLE;
17998
17999 VkResult err;
18000 bool pass;
18001 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18002 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18003 // uint32_t swapchain_image_count = 0;
18004 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18005 // uint32_t image_index = 0;
18006 // VkPresentInfoKHR present_info = {};
18007
Tony Barbour1fa09702017-03-16 12:09:08 -060018008 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018009
18010 // Use the create function from one of the VK_KHR_*_surface extension in
18011 // order to create a surface, testing all known errors in the process,
18012 // before successfully creating a surface:
18013 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18015 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18016 pass = (err != VK_SUCCESS);
18017 ASSERT_TRUE(pass);
18018 m_errorMonitor->VerifyFound();
18019
18020 // Next, try to create a surface with the wrong
18021 // VkXcbSurfaceCreateInfoKHR::sType:
18022 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18023 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18025 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18026 pass = (err != VK_SUCCESS);
18027 ASSERT_TRUE(pass);
18028 m_errorMonitor->VerifyFound();
18029
18030 // Create a native window, and then correctly create a surface:
18031 xcb_connection_t *connection;
18032 xcb_screen_t *screen;
18033 xcb_window_t xcb_window;
18034 xcb_intern_atom_reply_t *atom_wm_delete_window;
18035
18036 const xcb_setup_t *setup;
18037 xcb_screen_iterator_t iter;
18038 int scr;
18039 uint32_t value_mask, value_list[32];
18040 int width = 1;
18041 int height = 1;
18042
18043 connection = xcb_connect(NULL, &scr);
18044 ASSERT_TRUE(connection != NULL);
18045 setup = xcb_get_setup(connection);
18046 iter = xcb_setup_roots_iterator(setup);
18047 while (scr-- > 0)
18048 xcb_screen_next(&iter);
18049 screen = iter.data;
18050
18051 xcb_window = xcb_generate_id(connection);
18052
18053 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18054 value_list[0] = screen->black_pixel;
18055 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18056
18057 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18058 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18059
18060 /* Magic code that will send notification when window is destroyed */
18061 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18062 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18063
18064 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18065 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18066 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18067 free(reply);
18068
18069 xcb_map_window(connection, xcb_window);
18070
18071 // Force the x/y coordinates to 100,100 results are identical in consecutive
18072 // runs
18073 const uint32_t coords[] = { 100, 100 };
18074 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18075
18076 // Finally, try to correctly create a surface:
18077 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18078 xcb_create_info.pNext = NULL;
18079 xcb_create_info.flags = 0;
18080 xcb_create_info.connection = connection;
18081 xcb_create_info.window = xcb_window;
18082 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18083 pass = (err == VK_SUCCESS);
18084 ASSERT_TRUE(pass);
18085
18086 // Check if surface supports presentation:
18087
18088 // 1st, do so without having queried the queue families:
18089 VkBool32 supported = false;
18090 // TODO: Get the following error to come out:
18091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18092 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18093 "function");
18094 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18095 pass = (err != VK_SUCCESS);
18096 // ASSERT_TRUE(pass);
18097 // m_errorMonitor->VerifyFound();
18098
18099 // Next, query a queue family index that's too large:
18100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18101 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18102 pass = (err != VK_SUCCESS);
18103 ASSERT_TRUE(pass);
18104 m_errorMonitor->VerifyFound();
18105
18106 // Finally, do so correctly:
18107 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18108 // SUPPORTED
18109 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18110 pass = (err == VK_SUCCESS);
18111 ASSERT_TRUE(pass);
18112
18113 // Before proceeding, try to create a swapchain without having called
18114 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18115 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18116 swapchain_create_info.pNext = NULL;
18117 swapchain_create_info.flags = 0;
18118 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18119 swapchain_create_info.surface = surface;
18120 swapchain_create_info.imageArrayLayers = 1;
18121 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18122 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18124 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18125 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18126 pass = (err != VK_SUCCESS);
18127 ASSERT_TRUE(pass);
18128 m_errorMonitor->VerifyFound();
18129
18130 // Get the surface capabilities:
18131 VkSurfaceCapabilitiesKHR surface_capabilities;
18132
18133 // Do so correctly (only error logged by this entrypoint is if the
18134 // extension isn't enabled):
18135 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18136 pass = (err == VK_SUCCESS);
18137 ASSERT_TRUE(pass);
18138
18139 // Get the surface formats:
18140 uint32_t surface_format_count;
18141
18142 // First, try without a pointer to surface_format_count:
18143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18144 "specified as NULL");
18145 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18146 pass = (err == VK_SUCCESS);
18147 ASSERT_TRUE(pass);
18148 m_errorMonitor->VerifyFound();
18149
18150 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18151 // correctly done a 1st try (to get the count):
18152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18153 surface_format_count = 0;
18154 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18155 pass = (err == VK_SUCCESS);
18156 ASSERT_TRUE(pass);
18157 m_errorMonitor->VerifyFound();
18158
18159 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18160 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18161 pass = (err == VK_SUCCESS);
18162 ASSERT_TRUE(pass);
18163
18164 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18165 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18166
18167 // Next, do a 2nd try with surface_format_count being set too high:
18168 surface_format_count += 5;
18169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18170 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18171 pass = (err == VK_SUCCESS);
18172 ASSERT_TRUE(pass);
18173 m_errorMonitor->VerifyFound();
18174
18175 // Finally, do a correct 1st and 2nd try:
18176 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18177 pass = (err == VK_SUCCESS);
18178 ASSERT_TRUE(pass);
18179 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18180 pass = (err == VK_SUCCESS);
18181 ASSERT_TRUE(pass);
18182
18183 // Get the surface present modes:
18184 uint32_t surface_present_mode_count;
18185
18186 // First, try without a pointer to surface_format_count:
18187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18188 "specified as NULL");
18189
18190 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18191 pass = (err == VK_SUCCESS);
18192 ASSERT_TRUE(pass);
18193 m_errorMonitor->VerifyFound();
18194
18195 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18196 // correctly done a 1st try (to get the count):
18197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18198 surface_present_mode_count = 0;
18199 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18200 (VkPresentModeKHR *)&surface_present_mode_count);
18201 pass = (err == VK_SUCCESS);
18202 ASSERT_TRUE(pass);
18203 m_errorMonitor->VerifyFound();
18204
18205 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18206 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18207 pass = (err == VK_SUCCESS);
18208 ASSERT_TRUE(pass);
18209
18210 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18211 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18212
18213 // Next, do a 2nd try with surface_format_count being set too high:
18214 surface_present_mode_count += 5;
18215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18216 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18217 pass = (err == VK_SUCCESS);
18218 ASSERT_TRUE(pass);
18219 m_errorMonitor->VerifyFound();
18220
18221 // Finally, do a correct 1st and 2nd try:
18222 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18223 pass = (err == VK_SUCCESS);
18224 ASSERT_TRUE(pass);
18225 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18226 pass = (err == VK_SUCCESS);
18227 ASSERT_TRUE(pass);
18228
18229 // Create a swapchain:
18230
18231 // First, try without a pointer to swapchain_create_info:
18232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18233 "specified as NULL");
18234
18235 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18236 pass = (err != VK_SUCCESS);
18237 ASSERT_TRUE(pass);
18238 m_errorMonitor->VerifyFound();
18239
18240 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18241 // sType:
18242 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18244
18245 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18246 pass = (err != VK_SUCCESS);
18247 ASSERT_TRUE(pass);
18248 m_errorMonitor->VerifyFound();
18249
18250 // Next, call with a NULL swapchain pointer:
18251 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18252 swapchain_create_info.pNext = NULL;
18253 swapchain_create_info.flags = 0;
18254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18255 "specified as NULL");
18256
18257 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18258 pass = (err != VK_SUCCESS);
18259 ASSERT_TRUE(pass);
18260 m_errorMonitor->VerifyFound();
18261
18262 // TODO: Enhance swapchain layer so that
18263 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18264
18265 // Next, call with a queue family index that's too large:
18266 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18267 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18268 swapchain_create_info.queueFamilyIndexCount = 2;
18269 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18271 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18272 pass = (err != VK_SUCCESS);
18273 ASSERT_TRUE(pass);
18274 m_errorMonitor->VerifyFound();
18275
18276 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18277 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18278 swapchain_create_info.queueFamilyIndexCount = 1;
18279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18280 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18281 "pCreateInfo->pQueueFamilyIndices).");
18282 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18283 pass = (err != VK_SUCCESS);
18284 ASSERT_TRUE(pass);
18285 m_errorMonitor->VerifyFound();
18286
18287 // Next, call with an invalid imageSharingMode:
18288 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18289 swapchain_create_info.queueFamilyIndexCount = 1;
18290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18291 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18292 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18293 pass = (err != VK_SUCCESS);
18294 ASSERT_TRUE(pass);
18295 m_errorMonitor->VerifyFound();
18296 // Fix for the future:
18297 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18298 // SUPPORTED
18299 swapchain_create_info.queueFamilyIndexCount = 0;
18300 queueFamilyIndex[0] = 0;
18301 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18302
18303 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18304 // Get the images from a swapchain:
18305 // Acquire an image from a swapchain:
18306 // Present an image to a swapchain:
18307 // Destroy the swapchain:
18308
18309 // TODOs:
18310 //
18311 // - Try destroying the device without first destroying the swapchain
18312 //
18313 // - Try destroying the device without first destroying the surface
18314 //
18315 // - Try destroying the surface without first destroying the swapchain
18316
18317 // Destroy the surface:
18318 vkDestroySurfaceKHR(instance(), surface, NULL);
18319
18320 // Tear down the window:
18321 xcb_destroy_window(connection, xcb_window);
18322 xcb_disconnect(connection);
18323
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018324#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018325 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018326#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018327}
Chris Forbes09368e42016-10-13 11:59:22 +130018328#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018329
18330//
18331// POSITIVE VALIDATION TESTS
18332//
18333// These tests do not expect to encounter ANY validation errors pass only if this is true
18334
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018335TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18336 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018337 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018338 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18339
18340 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18341 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018342 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018343 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18344 command_buffer_allocate_info.commandBufferCount = 1;
18345
18346 VkCommandBuffer secondary_command_buffer;
18347 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18348 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18349 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18350 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18351 command_buffer_inheritance_info.renderPass = m_renderPass;
18352 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18353
18354 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18355 command_buffer_begin_info.flags =
18356 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18357 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18358
18359 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18360 VkClearAttachment color_attachment;
18361 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18362 color_attachment.clearValue.color.float32[0] = 0;
18363 color_attachment.clearValue.color.float32[1] = 0;
18364 color_attachment.clearValue.color.float32[2] = 0;
18365 color_attachment.clearValue.color.float32[3] = 0;
18366 color_attachment.colorAttachment = 0;
18367 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18368 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18369}
18370
Tobin Ehlise0006882016-11-03 10:14:28 -060018371TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018372 TEST_DESCRIPTION(
18373 "Perform an image layout transition in a secondary command buffer followed "
18374 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018375 VkResult err;
18376 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018377 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018378 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018379 if (!depth_format) {
18380 return;
18381 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18383 // Allocate a secondary and primary cmd buffer
18384 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18385 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018386 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018387 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18388 command_buffer_allocate_info.commandBufferCount = 1;
18389
18390 VkCommandBuffer secondary_command_buffer;
18391 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18392 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18393 VkCommandBuffer primary_command_buffer;
18394 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18395 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18396 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18397 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18398 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18399 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18400 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18401
18402 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18403 ASSERT_VK_SUCCESS(err);
18404 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018405 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 -060018406 ASSERT_TRUE(image.initialized());
18407 VkImageMemoryBarrier img_barrier = {};
18408 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18409 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18410 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18411 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18412 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18413 img_barrier.image = image.handle();
18414 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18415 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18416 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18417 img_barrier.subresourceRange.baseArrayLayer = 0;
18418 img_barrier.subresourceRange.baseMipLevel = 0;
18419 img_barrier.subresourceRange.layerCount = 1;
18420 img_barrier.subresourceRange.levelCount = 1;
18421 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18422 0, nullptr, 1, &img_barrier);
18423 err = vkEndCommandBuffer(secondary_command_buffer);
18424 ASSERT_VK_SUCCESS(err);
18425
18426 // Now update primary cmd buffer to execute secondary and transitions image
18427 command_buffer_begin_info.pInheritanceInfo = nullptr;
18428 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18429 ASSERT_VK_SUCCESS(err);
18430 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18431 VkImageMemoryBarrier img_barrier2 = {};
18432 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18433 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18434 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18435 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18436 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18437 img_barrier2.image = image.handle();
18438 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18439 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18440 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18441 img_barrier2.subresourceRange.baseArrayLayer = 0;
18442 img_barrier2.subresourceRange.baseMipLevel = 0;
18443 img_barrier2.subresourceRange.layerCount = 1;
18444 img_barrier2.subresourceRange.levelCount = 1;
18445 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18446 nullptr, 1, &img_barrier2);
18447 err = vkEndCommandBuffer(primary_command_buffer);
18448 ASSERT_VK_SUCCESS(err);
18449 VkSubmitInfo submit_info = {};
18450 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18451 submit_info.commandBufferCount = 1;
18452 submit_info.pCommandBuffers = &primary_command_buffer;
18453 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18454 ASSERT_VK_SUCCESS(err);
18455 m_errorMonitor->VerifyNotFound();
18456 err = vkDeviceWaitIdle(m_device->device());
18457 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018458 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18459 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018460}
18461
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018462// This is a positive test. No failures are expected.
18463TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018464 TEST_DESCRIPTION(
18465 "Ensure that the vkUpdateDescriptorSets validation code "
18466 "is ignoring VkWriteDescriptorSet members that are not "
18467 "related to the descriptor type specified by "
18468 "VkWriteDescriptorSet::descriptorType. Correct "
18469 "validation behavior will result in the test running to "
18470 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018471
18472 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18473
Tony Barbour1fa09702017-03-16 12:09:08 -060018474 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018475
18476 // Image Case
18477 {
18478 m_errorMonitor->ExpectSuccess();
18479
18480 VkImage image;
18481 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18482 const int32_t tex_width = 32;
18483 const int32_t tex_height = 32;
18484 VkImageCreateInfo image_create_info = {};
18485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18486 image_create_info.pNext = NULL;
18487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18488 image_create_info.format = tex_format;
18489 image_create_info.extent.width = tex_width;
18490 image_create_info.extent.height = tex_height;
18491 image_create_info.extent.depth = 1;
18492 image_create_info.mipLevels = 1;
18493 image_create_info.arrayLayers = 1;
18494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18495 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18496 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18497 image_create_info.flags = 0;
18498 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18499 ASSERT_VK_SUCCESS(err);
18500
18501 VkMemoryRequirements memory_reqs;
18502 VkDeviceMemory image_memory;
18503 bool pass;
18504 VkMemoryAllocateInfo memory_info = {};
18505 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18506 memory_info.pNext = NULL;
18507 memory_info.allocationSize = 0;
18508 memory_info.memoryTypeIndex = 0;
18509 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18510 memory_info.allocationSize = memory_reqs.size;
18511 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18512 ASSERT_TRUE(pass);
18513 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18514 ASSERT_VK_SUCCESS(err);
18515 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18516 ASSERT_VK_SUCCESS(err);
18517
18518 VkImageViewCreateInfo image_view_create_info = {};
18519 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18520 image_view_create_info.image = image;
18521 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18522 image_view_create_info.format = tex_format;
18523 image_view_create_info.subresourceRange.layerCount = 1;
18524 image_view_create_info.subresourceRange.baseMipLevel = 0;
18525 image_view_create_info.subresourceRange.levelCount = 1;
18526 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18527
18528 VkImageView view;
18529 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18530 ASSERT_VK_SUCCESS(err);
18531
18532 VkDescriptorPoolSize ds_type_count = {};
18533 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18534 ds_type_count.descriptorCount = 1;
18535
18536 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18537 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18538 ds_pool_ci.pNext = NULL;
18539 ds_pool_ci.maxSets = 1;
18540 ds_pool_ci.poolSizeCount = 1;
18541 ds_pool_ci.pPoolSizes = &ds_type_count;
18542
18543 VkDescriptorPool ds_pool;
18544 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18545 ASSERT_VK_SUCCESS(err);
18546
18547 VkDescriptorSetLayoutBinding dsl_binding = {};
18548 dsl_binding.binding = 0;
18549 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18550 dsl_binding.descriptorCount = 1;
18551 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18552 dsl_binding.pImmutableSamplers = NULL;
18553
18554 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18555 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18556 ds_layout_ci.pNext = NULL;
18557 ds_layout_ci.bindingCount = 1;
18558 ds_layout_ci.pBindings = &dsl_binding;
18559 VkDescriptorSetLayout ds_layout;
18560 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18561 ASSERT_VK_SUCCESS(err);
18562
18563 VkDescriptorSet descriptor_set;
18564 VkDescriptorSetAllocateInfo alloc_info = {};
18565 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18566 alloc_info.descriptorSetCount = 1;
18567 alloc_info.descriptorPool = ds_pool;
18568 alloc_info.pSetLayouts = &ds_layout;
18569 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18570 ASSERT_VK_SUCCESS(err);
18571
18572 VkDescriptorImageInfo image_info = {};
18573 image_info.imageView = view;
18574 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18575
18576 VkWriteDescriptorSet descriptor_write;
18577 memset(&descriptor_write, 0, sizeof(descriptor_write));
18578 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18579 descriptor_write.dstSet = descriptor_set;
18580 descriptor_write.dstBinding = 0;
18581 descriptor_write.descriptorCount = 1;
18582 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18583 descriptor_write.pImageInfo = &image_info;
18584
18585 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18586 // be
18587 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18588 // This will most likely produce a crash if the parameter_validation
18589 // layer
18590 // does not correctly ignore pBufferInfo.
18591 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18592 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18593
18594 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18595
18596 m_errorMonitor->VerifyNotFound();
18597
18598 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18599 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18600 vkDestroyImageView(m_device->device(), view, NULL);
18601 vkDestroyImage(m_device->device(), image, NULL);
18602 vkFreeMemory(m_device->device(), image_memory, NULL);
18603 }
18604
18605 // Buffer Case
18606 {
18607 m_errorMonitor->ExpectSuccess();
18608
18609 VkBuffer buffer;
18610 uint32_t queue_family_index = 0;
18611 VkBufferCreateInfo buffer_create_info = {};
18612 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18613 buffer_create_info.size = 1024;
18614 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18615 buffer_create_info.queueFamilyIndexCount = 1;
18616 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18617
18618 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18619 ASSERT_VK_SUCCESS(err);
18620
18621 VkMemoryRequirements memory_reqs;
18622 VkDeviceMemory buffer_memory;
18623 bool pass;
18624 VkMemoryAllocateInfo memory_info = {};
18625 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18626 memory_info.pNext = NULL;
18627 memory_info.allocationSize = 0;
18628 memory_info.memoryTypeIndex = 0;
18629
18630 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18631 memory_info.allocationSize = memory_reqs.size;
18632 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18633 ASSERT_TRUE(pass);
18634
18635 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18636 ASSERT_VK_SUCCESS(err);
18637 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18638 ASSERT_VK_SUCCESS(err);
18639
18640 VkDescriptorPoolSize ds_type_count = {};
18641 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18642 ds_type_count.descriptorCount = 1;
18643
18644 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18645 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18646 ds_pool_ci.pNext = NULL;
18647 ds_pool_ci.maxSets = 1;
18648 ds_pool_ci.poolSizeCount = 1;
18649 ds_pool_ci.pPoolSizes = &ds_type_count;
18650
18651 VkDescriptorPool ds_pool;
18652 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18653 ASSERT_VK_SUCCESS(err);
18654
18655 VkDescriptorSetLayoutBinding dsl_binding = {};
18656 dsl_binding.binding = 0;
18657 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18658 dsl_binding.descriptorCount = 1;
18659 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18660 dsl_binding.pImmutableSamplers = NULL;
18661
18662 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18663 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18664 ds_layout_ci.pNext = NULL;
18665 ds_layout_ci.bindingCount = 1;
18666 ds_layout_ci.pBindings = &dsl_binding;
18667 VkDescriptorSetLayout ds_layout;
18668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18669 ASSERT_VK_SUCCESS(err);
18670
18671 VkDescriptorSet descriptor_set;
18672 VkDescriptorSetAllocateInfo alloc_info = {};
18673 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18674 alloc_info.descriptorSetCount = 1;
18675 alloc_info.descriptorPool = ds_pool;
18676 alloc_info.pSetLayouts = &ds_layout;
18677 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18678 ASSERT_VK_SUCCESS(err);
18679
18680 VkDescriptorBufferInfo buffer_info = {};
18681 buffer_info.buffer = buffer;
18682 buffer_info.offset = 0;
18683 buffer_info.range = 1024;
18684
18685 VkWriteDescriptorSet descriptor_write;
18686 memset(&descriptor_write, 0, sizeof(descriptor_write));
18687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18688 descriptor_write.dstSet = descriptor_set;
18689 descriptor_write.dstBinding = 0;
18690 descriptor_write.descriptorCount = 1;
18691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18692 descriptor_write.pBufferInfo = &buffer_info;
18693
18694 // Set pImageInfo and pTexelBufferView to invalid values, which should
18695 // be
18696 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18697 // This will most likely produce a crash if the parameter_validation
18698 // layer
18699 // does not correctly ignore pImageInfo.
18700 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18701 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18702
18703 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18704
18705 m_errorMonitor->VerifyNotFound();
18706
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18709 vkDestroyBuffer(m_device->device(), buffer, NULL);
18710 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18711 }
18712
18713 // Texel Buffer Case
18714 {
18715 m_errorMonitor->ExpectSuccess();
18716
18717 VkBuffer buffer;
18718 uint32_t queue_family_index = 0;
18719 VkBufferCreateInfo buffer_create_info = {};
18720 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18721 buffer_create_info.size = 1024;
18722 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18723 buffer_create_info.queueFamilyIndexCount = 1;
18724 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18725
18726 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18727 ASSERT_VK_SUCCESS(err);
18728
18729 VkMemoryRequirements memory_reqs;
18730 VkDeviceMemory buffer_memory;
18731 bool pass;
18732 VkMemoryAllocateInfo memory_info = {};
18733 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18734 memory_info.pNext = NULL;
18735 memory_info.allocationSize = 0;
18736 memory_info.memoryTypeIndex = 0;
18737
18738 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18739 memory_info.allocationSize = memory_reqs.size;
18740 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18741 ASSERT_TRUE(pass);
18742
18743 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18744 ASSERT_VK_SUCCESS(err);
18745 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18746 ASSERT_VK_SUCCESS(err);
18747
18748 VkBufferViewCreateInfo buff_view_ci = {};
18749 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18750 buff_view_ci.buffer = buffer;
18751 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18752 buff_view_ci.range = VK_WHOLE_SIZE;
18753 VkBufferView buffer_view;
18754 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18755
18756 VkDescriptorPoolSize ds_type_count = {};
18757 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18758 ds_type_count.descriptorCount = 1;
18759
18760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18762 ds_pool_ci.pNext = NULL;
18763 ds_pool_ci.maxSets = 1;
18764 ds_pool_ci.poolSizeCount = 1;
18765 ds_pool_ci.pPoolSizes = &ds_type_count;
18766
18767 VkDescriptorPool ds_pool;
18768 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18769 ASSERT_VK_SUCCESS(err);
18770
18771 VkDescriptorSetLayoutBinding dsl_binding = {};
18772 dsl_binding.binding = 0;
18773 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18774 dsl_binding.descriptorCount = 1;
18775 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18776 dsl_binding.pImmutableSamplers = NULL;
18777
18778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18780 ds_layout_ci.pNext = NULL;
18781 ds_layout_ci.bindingCount = 1;
18782 ds_layout_ci.pBindings = &dsl_binding;
18783 VkDescriptorSetLayout ds_layout;
18784 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18785 ASSERT_VK_SUCCESS(err);
18786
18787 VkDescriptorSet descriptor_set;
18788 VkDescriptorSetAllocateInfo alloc_info = {};
18789 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18790 alloc_info.descriptorSetCount = 1;
18791 alloc_info.descriptorPool = ds_pool;
18792 alloc_info.pSetLayouts = &ds_layout;
18793 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18794 ASSERT_VK_SUCCESS(err);
18795
18796 VkWriteDescriptorSet descriptor_write;
18797 memset(&descriptor_write, 0, sizeof(descriptor_write));
18798 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18799 descriptor_write.dstSet = descriptor_set;
18800 descriptor_write.dstBinding = 0;
18801 descriptor_write.descriptorCount = 1;
18802 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18803 descriptor_write.pTexelBufferView = &buffer_view;
18804
18805 // Set pImageInfo and pBufferInfo to invalid values, which should be
18806 // ignored for descriptorType ==
18807 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18808 // This will most likely produce a crash if the parameter_validation
18809 // layer
18810 // does not correctly ignore pImageInfo and pBufferInfo.
18811 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18812 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18813
18814 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18815
18816 m_errorMonitor->VerifyNotFound();
18817
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018818 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18819 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18820 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18821 vkDestroyBuffer(m_device->device(), buffer, NULL);
18822 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18823 }
18824}
18825
Tobin Ehlisf7428442016-10-25 07:58:24 -060018826TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18827 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18828
Tony Barbour1fa09702017-03-16 12:09:08 -060018829 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018830 // Create layout where two binding #s are "1"
18831 static const uint32_t NUM_BINDINGS = 3;
18832 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18833 dsl_binding[0].binding = 1;
18834 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18835 dsl_binding[0].descriptorCount = 1;
18836 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18837 dsl_binding[0].pImmutableSamplers = NULL;
18838 dsl_binding[1].binding = 0;
18839 dsl_binding[1].descriptorCount = 1;
18840 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18841 dsl_binding[1].descriptorCount = 1;
18842 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18843 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018844 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018845 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18846 dsl_binding[2].descriptorCount = 1;
18847 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18848 dsl_binding[2].pImmutableSamplers = NULL;
18849
18850 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18851 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18852 ds_layout_ci.pNext = NULL;
18853 ds_layout_ci.bindingCount = NUM_BINDINGS;
18854 ds_layout_ci.pBindings = dsl_binding;
18855 VkDescriptorSetLayout ds_layout;
18856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18857 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18858 m_errorMonitor->VerifyFound();
18859}
18860
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018861TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018862 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18863
Tony Barbour1fa09702017-03-16 12:09:08 -060018864 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018865
Tony Barbour552f6c02016-12-21 14:34:07 -070018866 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018867
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018868 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18869
18870 {
18871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18872 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18873 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18874 m_errorMonitor->VerifyFound();
18875 }
18876
18877 {
18878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18879 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18880 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18881 m_errorMonitor->VerifyFound();
18882 }
18883
18884 {
18885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18886 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18887 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18888 m_errorMonitor->VerifyFound();
18889 }
18890
18891 {
18892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18893 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18894 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18895 m_errorMonitor->VerifyFound();
18896 }
18897
18898 {
18899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18900 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18901 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18902 m_errorMonitor->VerifyFound();
18903 }
18904
18905 {
18906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18907 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18908 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18909 m_errorMonitor->VerifyFound();
18910 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018911
18912 {
18913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18914 VkRect2D scissor = {{-1, 0}, {16, 16}};
18915 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18916 m_errorMonitor->VerifyFound();
18917 }
18918
18919 {
18920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18921 VkRect2D scissor = {{0, -2}, {16, 16}};
18922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18923 m_errorMonitor->VerifyFound();
18924 }
18925
18926 {
18927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18928 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18929 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18930 m_errorMonitor->VerifyFound();
18931 }
18932
18933 {
18934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18935 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18936 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18937 m_errorMonitor->VerifyFound();
18938 }
18939
Tony Barbour552f6c02016-12-21 14:34:07 -070018940 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018941}
18942
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018943// This is a positive test. No failures are expected.
18944TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18945 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18946 VkResult err;
18947
Tony Barbour1fa09702017-03-16 12:09:08 -060018948 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018949 m_errorMonitor->ExpectSuccess();
18950 VkDescriptorPoolSize ds_type_count = {};
18951 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18952 ds_type_count.descriptorCount = 2;
18953
18954 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18955 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18956 ds_pool_ci.pNext = NULL;
18957 ds_pool_ci.maxSets = 1;
18958 ds_pool_ci.poolSizeCount = 1;
18959 ds_pool_ci.pPoolSizes = &ds_type_count;
18960
18961 VkDescriptorPool ds_pool;
18962 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18963 ASSERT_VK_SUCCESS(err);
18964
18965 // Create layout with two uniform buffer descriptors w/ empty binding between them
18966 static const uint32_t NUM_BINDINGS = 3;
18967 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18968 dsl_binding[0].binding = 0;
18969 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18970 dsl_binding[0].descriptorCount = 1;
18971 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18972 dsl_binding[0].pImmutableSamplers = NULL;
18973 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018974 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018975 dsl_binding[2].binding = 2;
18976 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18977 dsl_binding[2].descriptorCount = 1;
18978 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18979 dsl_binding[2].pImmutableSamplers = NULL;
18980
18981 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18982 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18983 ds_layout_ci.pNext = NULL;
18984 ds_layout_ci.bindingCount = NUM_BINDINGS;
18985 ds_layout_ci.pBindings = dsl_binding;
18986 VkDescriptorSetLayout ds_layout;
18987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18988 ASSERT_VK_SUCCESS(err);
18989
18990 VkDescriptorSet descriptor_set = {};
18991 VkDescriptorSetAllocateInfo alloc_info = {};
18992 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18993 alloc_info.descriptorSetCount = 1;
18994 alloc_info.descriptorPool = ds_pool;
18995 alloc_info.pSetLayouts = &ds_layout;
18996 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18997 ASSERT_VK_SUCCESS(err);
18998
18999 // Create a buffer to be used for update
19000 VkBufferCreateInfo buff_ci = {};
19001 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19002 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19003 buff_ci.size = 256;
19004 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19005 VkBuffer buffer;
19006 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19007 ASSERT_VK_SUCCESS(err);
19008 // Have to bind memory to buffer before descriptor update
19009 VkMemoryAllocateInfo mem_alloc = {};
19010 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19011 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019012 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019013 mem_alloc.memoryTypeIndex = 0;
19014
19015 VkMemoryRequirements mem_reqs;
19016 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19017 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19018 if (!pass) {
19019 vkDestroyBuffer(m_device->device(), buffer, NULL);
19020 return;
19021 }
19022
19023 VkDeviceMemory mem;
19024 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19025 ASSERT_VK_SUCCESS(err);
19026 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19027 ASSERT_VK_SUCCESS(err);
19028
19029 // Only update the descriptor at binding 2
19030 VkDescriptorBufferInfo buff_info = {};
19031 buff_info.buffer = buffer;
19032 buff_info.offset = 0;
19033 buff_info.range = VK_WHOLE_SIZE;
19034 VkWriteDescriptorSet descriptor_write = {};
19035 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19036 descriptor_write.dstBinding = 2;
19037 descriptor_write.descriptorCount = 1;
19038 descriptor_write.pTexelBufferView = nullptr;
19039 descriptor_write.pBufferInfo = &buff_info;
19040 descriptor_write.pImageInfo = nullptr;
19041 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19042 descriptor_write.dstSet = descriptor_set;
19043
19044 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19045
19046 m_errorMonitor->VerifyNotFound();
19047 // Cleanup
19048 vkFreeMemory(m_device->device(), mem, NULL);
19049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19050 vkDestroyBuffer(m_device->device(), buffer, NULL);
19051 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19052}
19053
19054// This is a positive test. No failures are expected.
19055TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19056 VkResult err;
19057 bool pass;
19058
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019059 TEST_DESCRIPTION(
19060 "Create a buffer, allocate memory, bind memory, destroy "
19061 "the buffer, create an image, and bind the same memory to "
19062 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019063
19064 m_errorMonitor->ExpectSuccess();
19065
Tony Barbour1fa09702017-03-16 12:09:08 -060019066 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019067
19068 VkBuffer buffer;
19069 VkImage image;
19070 VkDeviceMemory mem;
19071 VkMemoryRequirements mem_reqs;
19072
19073 VkBufferCreateInfo buf_info = {};
19074 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19075 buf_info.pNext = NULL;
19076 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19077 buf_info.size = 256;
19078 buf_info.queueFamilyIndexCount = 0;
19079 buf_info.pQueueFamilyIndices = NULL;
19080 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19081 buf_info.flags = 0;
19082 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19083 ASSERT_VK_SUCCESS(err);
19084
19085 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19086
19087 VkMemoryAllocateInfo alloc_info = {};
19088 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19089 alloc_info.pNext = NULL;
19090 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019091
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019092 // Ensure memory is big enough for both bindings
19093 alloc_info.allocationSize = 0x10000;
19094
19095 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19096 if (!pass) {
19097 vkDestroyBuffer(m_device->device(), buffer, NULL);
19098 return;
19099 }
19100
19101 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19102 ASSERT_VK_SUCCESS(err);
19103
19104 uint8_t *pData;
19105 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19106 ASSERT_VK_SUCCESS(err);
19107
19108 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19109
19110 vkUnmapMemory(m_device->device(), mem);
19111
19112 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19113 ASSERT_VK_SUCCESS(err);
19114
19115 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19116 // memory. In fact, it was never used by the GPU.
19117 // Just be be sure, wait for idle.
19118 vkDestroyBuffer(m_device->device(), buffer, NULL);
19119 vkDeviceWaitIdle(m_device->device());
19120
Tobin Ehlis6a005702016-12-28 15:25:56 -070019121 // Use optimal as some platforms report linear support but then fail image creation
19122 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19123 VkImageFormatProperties image_format_properties;
19124 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19125 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19126 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019127 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019128 vkFreeMemory(m_device->device(), mem, NULL);
19129 return;
19130 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019131 VkImageCreateInfo image_create_info = {};
19132 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19133 image_create_info.pNext = NULL;
19134 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19135 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19136 image_create_info.extent.width = 64;
19137 image_create_info.extent.height = 64;
19138 image_create_info.extent.depth = 1;
19139 image_create_info.mipLevels = 1;
19140 image_create_info.arrayLayers = 1;
19141 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019142 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019143 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19144 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19145 image_create_info.queueFamilyIndexCount = 0;
19146 image_create_info.pQueueFamilyIndices = NULL;
19147 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19148 image_create_info.flags = 0;
19149
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019150 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019151 * to be textures or it will be the staging image if they are not.
19152 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019153 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19154 ASSERT_VK_SUCCESS(err);
19155
19156 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19157
Tobin Ehlis6a005702016-12-28 15:25:56 -070019158 VkMemoryAllocateInfo mem_alloc = {};
19159 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19160 mem_alloc.pNext = NULL;
19161 mem_alloc.allocationSize = 0;
19162 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019163 mem_alloc.allocationSize = mem_reqs.size;
19164
19165 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19166 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019167 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019168 vkDestroyImage(m_device->device(), image, NULL);
19169 return;
19170 }
19171
19172 // VALIDATION FAILURE:
19173 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19174 ASSERT_VK_SUCCESS(err);
19175
19176 m_errorMonitor->VerifyNotFound();
19177
19178 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019179 vkDestroyImage(m_device->device(), image, NULL);
19180}
19181
Tony Barbourab713912017-02-02 14:17:35 -070019182// This is a positive test. No failures are expected.
19183TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19184 VkResult err;
19185
19186 TEST_DESCRIPTION(
19187 "Call all applicable destroy and free routines with NULL"
19188 "handles, expecting no validation errors");
19189
19190 m_errorMonitor->ExpectSuccess();
19191
Tony Barbour1fa09702017-03-16 12:09:08 -060019192 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019193 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19195 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19196 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19199 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19201 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19202 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19203 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19204 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19205 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19206 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19207 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19208 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19209 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19210 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19211 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19212 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19213
19214 VkCommandPool command_pool;
19215 VkCommandPoolCreateInfo pool_create_info{};
19216 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19217 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19218 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19219 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19220 VkCommandBuffer command_buffers[3] = {};
19221 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19222 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19223 command_buffer_allocate_info.commandPool = command_pool;
19224 command_buffer_allocate_info.commandBufferCount = 1;
19225 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19226 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19227 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19228 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19229
19230 VkDescriptorPoolSize ds_type_count = {};
19231 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19232 ds_type_count.descriptorCount = 1;
19233
19234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19236 ds_pool_ci.pNext = NULL;
19237 ds_pool_ci.maxSets = 1;
19238 ds_pool_ci.poolSizeCount = 1;
19239 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19240 ds_pool_ci.pPoolSizes = &ds_type_count;
19241
19242 VkDescriptorPool ds_pool;
19243 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19244 ASSERT_VK_SUCCESS(err);
19245
19246 VkDescriptorSetLayoutBinding dsl_binding = {};
19247 dsl_binding.binding = 2;
19248 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19249 dsl_binding.descriptorCount = 1;
19250 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19251 dsl_binding.pImmutableSamplers = NULL;
19252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19254 ds_layout_ci.pNext = NULL;
19255 ds_layout_ci.bindingCount = 1;
19256 ds_layout_ci.pBindings = &dsl_binding;
19257 VkDescriptorSetLayout ds_layout;
19258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19259 ASSERT_VK_SUCCESS(err);
19260
19261 VkDescriptorSet descriptor_sets[3] = {};
19262 VkDescriptorSetAllocateInfo alloc_info = {};
19263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19264 alloc_info.descriptorSetCount = 1;
19265 alloc_info.descriptorPool = ds_pool;
19266 alloc_info.pSetLayouts = &ds_layout;
19267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19268 ASSERT_VK_SUCCESS(err);
19269 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19272
19273 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19274
19275 m_errorMonitor->VerifyNotFound();
19276}
19277
Tony Barbour626994c2017-02-08 15:29:37 -070019278TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019279 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019280
19281 m_errorMonitor->ExpectSuccess();
19282
Tony Barbour1fa09702017-03-16 12:09:08 -060019283 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019284 VkCommandBuffer cmd_bufs[4];
19285 VkCommandBufferAllocateInfo alloc_info;
19286 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19287 alloc_info.pNext = NULL;
19288 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019289 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019290 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19291 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19292 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019293 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19294 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19295 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019296 ASSERT_TRUE(image.initialized());
19297 VkCommandBufferBeginInfo cb_binfo;
19298 cb_binfo.pNext = NULL;
19299 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19300 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19301 cb_binfo.flags = 0;
19302 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19303 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19304 VkImageMemoryBarrier img_barrier = {};
19305 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19306 img_barrier.pNext = NULL;
19307 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19308 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19309 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19310 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19311 img_barrier.image = image.handle();
19312 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19313 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19314 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19315 img_barrier.subresourceRange.baseArrayLayer = 0;
19316 img_barrier.subresourceRange.baseMipLevel = 0;
19317 img_barrier.subresourceRange.layerCount = 1;
19318 img_barrier.subresourceRange.levelCount = 1;
19319 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19320 &img_barrier);
19321 vkEndCommandBuffer(cmd_bufs[0]);
19322 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19323 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19324 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19325 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19326 &img_barrier);
19327 vkEndCommandBuffer(cmd_bufs[1]);
19328 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19329 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19330 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19331 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19332 &img_barrier);
19333 vkEndCommandBuffer(cmd_bufs[2]);
19334 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19335 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19336 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19337 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19338 &img_barrier);
19339 vkEndCommandBuffer(cmd_bufs[3]);
19340
19341 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19342 VkSemaphore semaphore1, semaphore2;
19343 VkSemaphoreCreateInfo semaphore_create_info{};
19344 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19345 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19346 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19347 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19348 VkSubmitInfo submit_info[3];
19349 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19350 submit_info[0].pNext = nullptr;
19351 submit_info[0].commandBufferCount = 1;
19352 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19353 submit_info[0].signalSemaphoreCount = 1;
19354 submit_info[0].pSignalSemaphores = &semaphore1;
19355 submit_info[0].waitSemaphoreCount = 0;
19356 submit_info[0].pWaitDstStageMask = nullptr;
19357 submit_info[0].pWaitDstStageMask = flags;
19358 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19359 submit_info[1].pNext = nullptr;
19360 submit_info[1].commandBufferCount = 1;
19361 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19362 submit_info[1].waitSemaphoreCount = 1;
19363 submit_info[1].pWaitSemaphores = &semaphore1;
19364 submit_info[1].signalSemaphoreCount = 1;
19365 submit_info[1].pSignalSemaphores = &semaphore2;
19366 submit_info[1].pWaitDstStageMask = flags;
19367 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19368 submit_info[2].pNext = nullptr;
19369 submit_info[2].commandBufferCount = 2;
19370 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19371 submit_info[2].waitSemaphoreCount = 1;
19372 submit_info[2].pWaitSemaphores = &semaphore2;
19373 submit_info[2].signalSemaphoreCount = 0;
19374 submit_info[2].pSignalSemaphores = nullptr;
19375 submit_info[2].pWaitDstStageMask = flags;
19376 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19377 vkQueueWaitIdle(m_device->m_queue);
19378
19379 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19380 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19381 m_errorMonitor->VerifyNotFound();
19382}
19383
Tobin Ehlis953e8392016-11-17 10:54:13 -070019384TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19385 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19386 // We previously had a bug where dynamic offset of inactive bindings was still being used
19387 VkResult err;
19388 m_errorMonitor->ExpectSuccess();
19389
Tony Barbour1fa09702017-03-16 12:09:08 -060019390 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019391 ASSERT_NO_FATAL_FAILURE(InitViewport());
19392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19393
19394 VkDescriptorPoolSize ds_type_count = {};
19395 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19396 ds_type_count.descriptorCount = 3;
19397
19398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19400 ds_pool_ci.pNext = NULL;
19401 ds_pool_ci.maxSets = 1;
19402 ds_pool_ci.poolSizeCount = 1;
19403 ds_pool_ci.pPoolSizes = &ds_type_count;
19404
19405 VkDescriptorPool ds_pool;
19406 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19407 ASSERT_VK_SUCCESS(err);
19408
19409 const uint32_t BINDING_COUNT = 3;
19410 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019411 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019412 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19413 dsl_binding[0].descriptorCount = 1;
19414 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19415 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019416 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019417 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19418 dsl_binding[1].descriptorCount = 1;
19419 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19420 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019421 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019422 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19423 dsl_binding[2].descriptorCount = 1;
19424 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19425 dsl_binding[2].pImmutableSamplers = NULL;
19426
19427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19429 ds_layout_ci.pNext = NULL;
19430 ds_layout_ci.bindingCount = BINDING_COUNT;
19431 ds_layout_ci.pBindings = dsl_binding;
19432 VkDescriptorSetLayout ds_layout;
19433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19434 ASSERT_VK_SUCCESS(err);
19435
19436 VkDescriptorSet descriptor_set;
19437 VkDescriptorSetAllocateInfo alloc_info = {};
19438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19439 alloc_info.descriptorSetCount = 1;
19440 alloc_info.descriptorPool = ds_pool;
19441 alloc_info.pSetLayouts = &ds_layout;
19442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19443 ASSERT_VK_SUCCESS(err);
19444
19445 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19446 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19447 pipeline_layout_ci.pNext = NULL;
19448 pipeline_layout_ci.setLayoutCount = 1;
19449 pipeline_layout_ci.pSetLayouts = &ds_layout;
19450
19451 VkPipelineLayout pipeline_layout;
19452 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19453 ASSERT_VK_SUCCESS(err);
19454
19455 // Create two buffers to update the descriptors with
19456 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19457 uint32_t qfi = 0;
19458 VkBufferCreateInfo buffCI = {};
19459 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19460 buffCI.size = 2048;
19461 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19462 buffCI.queueFamilyIndexCount = 1;
19463 buffCI.pQueueFamilyIndices = &qfi;
19464
19465 VkBuffer dyub1;
19466 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19467 ASSERT_VK_SUCCESS(err);
19468 // buffer2
19469 buffCI.size = 1024;
19470 VkBuffer dyub2;
19471 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19472 ASSERT_VK_SUCCESS(err);
19473 // Allocate memory and bind to buffers
19474 VkMemoryAllocateInfo mem_alloc[2] = {};
19475 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19476 mem_alloc[0].pNext = NULL;
19477 mem_alloc[0].memoryTypeIndex = 0;
19478 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19479 mem_alloc[1].pNext = NULL;
19480 mem_alloc[1].memoryTypeIndex = 0;
19481
19482 VkMemoryRequirements mem_reqs1;
19483 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19484 VkMemoryRequirements mem_reqs2;
19485 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19486 mem_alloc[0].allocationSize = mem_reqs1.size;
19487 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19488 mem_alloc[1].allocationSize = mem_reqs2.size;
19489 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19490 if (!pass) {
19491 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19492 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19493 return;
19494 }
19495
19496 VkDeviceMemory mem1;
19497 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19498 ASSERT_VK_SUCCESS(err);
19499 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19500 ASSERT_VK_SUCCESS(err);
19501 VkDeviceMemory mem2;
19502 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19503 ASSERT_VK_SUCCESS(err);
19504 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19505 ASSERT_VK_SUCCESS(err);
19506 // Update descriptors
19507 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19508 buff_info[0].buffer = dyub1;
19509 buff_info[0].offset = 0;
19510 buff_info[0].range = 256;
19511 buff_info[1].buffer = dyub1;
19512 buff_info[1].offset = 256;
19513 buff_info[1].range = 512;
19514 buff_info[2].buffer = dyub2;
19515 buff_info[2].offset = 0;
19516 buff_info[2].range = 512;
19517
19518 VkWriteDescriptorSet descriptor_write;
19519 memset(&descriptor_write, 0, sizeof(descriptor_write));
19520 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19521 descriptor_write.dstSet = descriptor_set;
19522 descriptor_write.dstBinding = 0;
19523 descriptor_write.descriptorCount = BINDING_COUNT;
19524 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19525 descriptor_write.pBufferInfo = buff_info;
19526
19527 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19528
Tony Barbour552f6c02016-12-21 14:34:07 -070019529 m_commandBuffer->BeginCommandBuffer();
19530 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019531
19532 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019533 char const *vsSource =
19534 "#version 450\n"
19535 "\n"
19536 "out gl_PerVertex { \n"
19537 " vec4 gl_Position;\n"
19538 "};\n"
19539 "void main(){\n"
19540 " gl_Position = vec4(1);\n"
19541 "}\n";
19542 char const *fsSource =
19543 "#version 450\n"
19544 "\n"
19545 "layout(location=0) out vec4 x;\n"
19546 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19547 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19548 "void main(){\n"
19549 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19550 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019551 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19552 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19553 VkPipelineObj pipe(m_device);
19554 pipe.SetViewport(m_viewports);
19555 pipe.SetScissor(m_scissors);
19556 pipe.AddShader(&vs);
19557 pipe.AddShader(&fs);
19558 pipe.AddColorAttachment();
19559 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19560
19561 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19562 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19563 // we used to have a bug in this case.
19564 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19565 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19566 &descriptor_set, BINDING_COUNT, dyn_off);
19567 Draw(1, 0, 0, 0);
19568 m_errorMonitor->VerifyNotFound();
19569
19570 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19571 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19572 vkFreeMemory(m_device->device(), mem1, NULL);
19573 vkFreeMemory(m_device->device(), mem2, NULL);
19574
19575 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19576 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19577 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19578}
19579
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019580TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019581 TEST_DESCRIPTION(
19582 "Ensure that validations handling of non-coherent memory "
19583 "mapping while using VK_WHOLE_SIZE does not cause access "
19584 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019585 VkResult err;
19586 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019587 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019588
19589 VkDeviceMemory mem;
19590 VkMemoryRequirements mem_reqs;
19591 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019592 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019593 VkMemoryAllocateInfo alloc_info = {};
19594 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19595 alloc_info.pNext = NULL;
19596 alloc_info.memoryTypeIndex = 0;
19597
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019598 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019599 alloc_info.allocationSize = allocation_size;
19600
19601 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19602 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 -070019603 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019604 if (!pass) {
19605 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019606 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19607 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019608 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019609 pass = m_device->phy().set_memory_type(
19610 mem_reqs.memoryTypeBits, &alloc_info,
19611 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19612 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019613 if (!pass) {
19614 return;
19615 }
19616 }
19617 }
19618
19619 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19620 ASSERT_VK_SUCCESS(err);
19621
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019622 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019623 m_errorMonitor->ExpectSuccess();
19624 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19625 ASSERT_VK_SUCCESS(err);
19626 VkMappedMemoryRange mmr = {};
19627 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19628 mmr.memory = mem;
19629 mmr.offset = 0;
19630 mmr.size = VK_WHOLE_SIZE;
19631 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19632 ASSERT_VK_SUCCESS(err);
19633 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19634 ASSERT_VK_SUCCESS(err);
19635 m_errorMonitor->VerifyNotFound();
19636 vkUnmapMemory(m_device->device(), mem);
19637
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019638 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019639 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019640 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019641 ASSERT_VK_SUCCESS(err);
19642 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19643 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019644 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019645 mmr.size = VK_WHOLE_SIZE;
19646 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19647 ASSERT_VK_SUCCESS(err);
19648 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19649 ASSERT_VK_SUCCESS(err);
19650 m_errorMonitor->VerifyNotFound();
19651 vkUnmapMemory(m_device->device(), mem);
19652
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019653 // Map with offset and size
19654 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019655 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019656 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019657 ASSERT_VK_SUCCESS(err);
19658 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19659 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019660 mmr.offset = 4 * atom_size;
19661 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019662 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19663 ASSERT_VK_SUCCESS(err);
19664 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19665 ASSERT_VK_SUCCESS(err);
19666 m_errorMonitor->VerifyNotFound();
19667 vkUnmapMemory(m_device->device(), mem);
19668
19669 // Map without offset and flush WHOLE_SIZE with two separate offsets
19670 m_errorMonitor->ExpectSuccess();
19671 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19672 ASSERT_VK_SUCCESS(err);
19673 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19674 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019675 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019676 mmr.size = VK_WHOLE_SIZE;
19677 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19678 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019679 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019680 mmr.size = VK_WHOLE_SIZE;
19681 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19682 ASSERT_VK_SUCCESS(err);
19683 m_errorMonitor->VerifyNotFound();
19684 vkUnmapMemory(m_device->device(), mem);
19685
19686 vkFreeMemory(m_device->device(), mem, NULL);
19687}
19688
19689// This is a positive test. We used to expect error in this case but spec now allows it
19690TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19691 m_errorMonitor->ExpectSuccess();
19692 vk_testing::Fence testFence;
19693 VkFenceCreateInfo fenceInfo = {};
19694 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19695 fenceInfo.pNext = NULL;
19696
Tony Barbour1fa09702017-03-16 12:09:08 -060019697 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019698 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019699 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019700 VkResult result = vkResetFences(m_device->device(), 1, fences);
19701 ASSERT_VK_SUCCESS(result);
19702
19703 m_errorMonitor->VerifyNotFound();
19704}
19705
19706TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19707 m_errorMonitor->ExpectSuccess();
19708
Tony Barbour1fa09702017-03-16 12:09:08 -060019709 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019710 VkResult err;
19711
19712 // Record (empty!) command buffer that can be submitted multiple times
19713 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019714 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19715 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019716 m_commandBuffer->BeginCommandBuffer(&cbbi);
19717 m_commandBuffer->EndCommandBuffer();
19718
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019719 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019720 VkFence fence;
19721 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19722 ASSERT_VK_SUCCESS(err);
19723
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019724 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019725 VkSemaphore s1, s2;
19726 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19727 ASSERT_VK_SUCCESS(err);
19728 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19729 ASSERT_VK_SUCCESS(err);
19730
19731 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019732 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019733 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19734 ASSERT_VK_SUCCESS(err);
19735
19736 // Submit CB again, signaling s2.
19737 si.pSignalSemaphores = &s2;
19738 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19739 ASSERT_VK_SUCCESS(err);
19740
19741 // Wait for fence.
19742 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19743 ASSERT_VK_SUCCESS(err);
19744
19745 // CB is still in flight from second submission, but semaphore s1 is no
19746 // longer in flight. delete it.
19747 vkDestroySemaphore(m_device->device(), s1, nullptr);
19748
19749 m_errorMonitor->VerifyNotFound();
19750
19751 // Force device idle and clean up remaining objects
19752 vkDeviceWaitIdle(m_device->device());
19753 vkDestroySemaphore(m_device->device(), s2, nullptr);
19754 vkDestroyFence(m_device->device(), fence, nullptr);
19755}
19756
19757TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19758 m_errorMonitor->ExpectSuccess();
19759
Tony Barbour1fa09702017-03-16 12:09:08 -060019760 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019761 VkResult err;
19762
19763 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019764 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765 VkFence f1;
19766 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19767 ASSERT_VK_SUCCESS(err);
19768
19769 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019770 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019771 VkFence f2;
19772 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19773 ASSERT_VK_SUCCESS(err);
19774
19775 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019776 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019777 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19778
19779 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019780 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019781 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19782
19783 // Should have both retired!
19784 vkDestroyFence(m_device->device(), f1, nullptr);
19785 vkDestroyFence(m_device->device(), f2, nullptr);
19786
19787 m_errorMonitor->VerifyNotFound();
19788}
19789
19790TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019791 TEST_DESCRIPTION(
19792 "Verify that creating an image view from an image with valid usage "
19793 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019794
Tony Barbour1fa09702017-03-16 12:09:08 -060019795 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019796
19797 m_errorMonitor->ExpectSuccess();
19798 // Verify that we can create a view with usage INPUT_ATTACHMENT
19799 VkImageObj image(m_device);
19800 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19801 ASSERT_TRUE(image.initialized());
19802 VkImageView imageView;
19803 VkImageViewCreateInfo ivci = {};
19804 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19805 ivci.image = image.handle();
19806 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19807 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19808 ivci.subresourceRange.layerCount = 1;
19809 ivci.subresourceRange.baseMipLevel = 0;
19810 ivci.subresourceRange.levelCount = 1;
19811 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19812
19813 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19814 m_errorMonitor->VerifyNotFound();
19815 vkDestroyImageView(m_device->device(), imageView, NULL);
19816}
19817
19818// This is a positive test. No failures are expected.
19819TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019820 TEST_DESCRIPTION(
19821 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19822 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019823
Tony Barbour1fa09702017-03-16 12:09:08 -060019824 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019825
19826 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019827 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019828 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019829
19830 m_errorMonitor->ExpectSuccess();
19831
19832 VkImage image;
19833 VkImageCreateInfo image_create_info = {};
19834 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19835 image_create_info.pNext = NULL;
19836 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19837 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19838 image_create_info.extent.width = 64;
19839 image_create_info.extent.height = 64;
19840 image_create_info.extent.depth = 1;
19841 image_create_info.mipLevels = 1;
19842 image_create_info.arrayLayers = 1;
19843 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19844 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19845 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19846 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19847 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19848 ASSERT_VK_SUCCESS(err);
19849
19850 VkMemoryRequirements memory_reqs;
19851 VkDeviceMemory memory_one, memory_two;
19852 bool pass;
19853 VkMemoryAllocateInfo memory_info = {};
19854 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19855 memory_info.pNext = NULL;
19856 memory_info.allocationSize = 0;
19857 memory_info.memoryTypeIndex = 0;
19858 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19859 // Find an image big enough to allow sparse mapping of 2 memory regions
19860 // Increase the image size until it is at least twice the
19861 // size of the required alignment, to ensure we can bind both
19862 // allocated memory blocks to the image on aligned offsets.
19863 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19864 vkDestroyImage(m_device->device(), image, nullptr);
19865 image_create_info.extent.width *= 2;
19866 image_create_info.extent.height *= 2;
19867 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19868 ASSERT_VK_SUCCESS(err);
19869 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19870 }
19871 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19872 // at the end of the first
19873 memory_info.allocationSize = memory_reqs.alignment;
19874 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19875 ASSERT_TRUE(pass);
19876 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19877 ASSERT_VK_SUCCESS(err);
19878 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19879 ASSERT_VK_SUCCESS(err);
19880 VkSparseMemoryBind binds[2];
19881 binds[0].flags = 0;
19882 binds[0].memory = memory_one;
19883 binds[0].memoryOffset = 0;
19884 binds[0].resourceOffset = 0;
19885 binds[0].size = memory_info.allocationSize;
19886 binds[1].flags = 0;
19887 binds[1].memory = memory_two;
19888 binds[1].memoryOffset = 0;
19889 binds[1].resourceOffset = memory_info.allocationSize;
19890 binds[1].size = memory_info.allocationSize;
19891
19892 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19893 opaqueBindInfo.image = image;
19894 opaqueBindInfo.bindCount = 2;
19895 opaqueBindInfo.pBinds = binds;
19896
19897 VkFence fence = VK_NULL_HANDLE;
19898 VkBindSparseInfo bindSparseInfo = {};
19899 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19900 bindSparseInfo.imageOpaqueBindCount = 1;
19901 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19902
19903 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19904 vkQueueWaitIdle(m_device->m_queue);
19905 vkDestroyImage(m_device->device(), image, NULL);
19906 vkFreeMemory(m_device->device(), memory_one, NULL);
19907 vkFreeMemory(m_device->device(), memory_two, NULL);
19908 m_errorMonitor->VerifyNotFound();
19909}
19910
19911TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019912 TEST_DESCRIPTION(
19913 "Ensure that CmdBeginRenderPass with an attachment's "
19914 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19915 "the command buffer has prior knowledge of that "
19916 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019917
19918 m_errorMonitor->ExpectSuccess();
19919
Tony Barbour1fa09702017-03-16 12:09:08 -060019920 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921
19922 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019923 VkAttachmentDescription attachment = {0,
19924 VK_FORMAT_R8G8B8A8_UNORM,
19925 VK_SAMPLE_COUNT_1_BIT,
19926 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19927 VK_ATTACHMENT_STORE_OP_STORE,
19928 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19929 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19930 VK_IMAGE_LAYOUT_UNDEFINED,
19931 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019932
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019933 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019934
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019935 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019936
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019937 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019938
19939 VkRenderPass rp;
19940 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19941 ASSERT_VK_SUCCESS(err);
19942
19943 // A compatible framebuffer.
19944 VkImageObj image(m_device);
19945 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19946 ASSERT_TRUE(image.initialized());
19947
19948 VkImageViewCreateInfo ivci = {
19949 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19950 nullptr,
19951 0,
19952 image.handle(),
19953 VK_IMAGE_VIEW_TYPE_2D,
19954 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019955 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19956 VK_COMPONENT_SWIZZLE_IDENTITY},
19957 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019958 };
19959 VkImageView view;
19960 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19961 ASSERT_VK_SUCCESS(err);
19962
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019963 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019964 VkFramebuffer fb;
19965 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19966 ASSERT_VK_SUCCESS(err);
19967
19968 // Record a single command buffer which uses this renderpass twice. The
19969 // bug is triggered at the beginning of the second renderpass, when the
19970 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019971 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 -070019972 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019973 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19974 vkCmdEndRenderPass(m_commandBuffer->handle());
19975 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19976
19977 m_errorMonitor->VerifyNotFound();
19978
19979 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019980 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019981
19982 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19983 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19984 vkDestroyImageView(m_device->device(), view, nullptr);
19985}
19986
19987TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019988 TEST_DESCRIPTION(
19989 "This test should pass. Create a Framebuffer and "
19990 "command buffer, bind them together, then destroy "
19991 "command pool and framebuffer and verify there are no "
19992 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019993
19994 m_errorMonitor->ExpectSuccess();
19995
Tony Barbour1fa09702017-03-16 12:09:08 -060019996 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019997
19998 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019999 VkAttachmentDescription attachment = {0,
20000 VK_FORMAT_R8G8B8A8_UNORM,
20001 VK_SAMPLE_COUNT_1_BIT,
20002 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20003 VK_ATTACHMENT_STORE_OP_STORE,
20004 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20005 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20006 VK_IMAGE_LAYOUT_UNDEFINED,
20007 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020008
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020009 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020011 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020012
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020013 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020014
20015 VkRenderPass rp;
20016 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20017 ASSERT_VK_SUCCESS(err);
20018
20019 // A compatible framebuffer.
20020 VkImageObj image(m_device);
20021 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20022 ASSERT_TRUE(image.initialized());
20023
20024 VkImageViewCreateInfo ivci = {
20025 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20026 nullptr,
20027 0,
20028 image.handle(),
20029 VK_IMAGE_VIEW_TYPE_2D,
20030 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020031 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20032 VK_COMPONENT_SWIZZLE_IDENTITY},
20033 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020034 };
20035 VkImageView view;
20036 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20037 ASSERT_VK_SUCCESS(err);
20038
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020039 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020040 VkFramebuffer fb;
20041 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20042 ASSERT_VK_SUCCESS(err);
20043
20044 // Explicitly create a command buffer to bind the FB to so that we can then
20045 // destroy the command pool in order to implicitly free command buffer
20046 VkCommandPool command_pool;
20047 VkCommandPoolCreateInfo pool_create_info{};
20048 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20049 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20050 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20051 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20052
20053 VkCommandBuffer command_buffer;
20054 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20055 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20056 command_buffer_allocate_info.commandPool = command_pool;
20057 command_buffer_allocate_info.commandBufferCount = 1;
20058 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20059 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20060
20061 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020062 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 -060020063 VkCommandBufferBeginInfo begin_info{};
20064 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20065 vkBeginCommandBuffer(command_buffer, &begin_info);
20066
20067 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20068 vkCmdEndRenderPass(command_buffer);
20069 vkEndCommandBuffer(command_buffer);
20070 vkDestroyImageView(m_device->device(), view, nullptr);
20071 // Destroy command pool to implicitly free command buffer
20072 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20073 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20074 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20075 m_errorMonitor->VerifyNotFound();
20076}
20077
20078TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020079 TEST_DESCRIPTION(
20080 "Ensure that CmdBeginRenderPass applies the layout "
20081 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020082
20083 m_errorMonitor->ExpectSuccess();
20084
Tony Barbour1fa09702017-03-16 12:09:08 -060020085 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020086
20087 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020088 VkAttachmentDescription attachment = {0,
20089 VK_FORMAT_R8G8B8A8_UNORM,
20090 VK_SAMPLE_COUNT_1_BIT,
20091 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20092 VK_ATTACHMENT_STORE_OP_STORE,
20093 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20094 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20095 VK_IMAGE_LAYOUT_UNDEFINED,
20096 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020097
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020098 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020099
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020100 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020101
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020102 VkSubpassDependency dep = {0,
20103 0,
20104 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20105 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20106 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20107 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20108 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020109
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020110 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020111
20112 VkResult err;
20113 VkRenderPass rp;
20114 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20115 ASSERT_VK_SUCCESS(err);
20116
20117 // A compatible framebuffer.
20118 VkImageObj image(m_device);
20119 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20120 ASSERT_TRUE(image.initialized());
20121
20122 VkImageViewCreateInfo ivci = {
20123 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20124 nullptr,
20125 0,
20126 image.handle(),
20127 VK_IMAGE_VIEW_TYPE_2D,
20128 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020129 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20130 VK_COMPONENT_SWIZZLE_IDENTITY},
20131 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020132 };
20133 VkImageView view;
20134 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20135 ASSERT_VK_SUCCESS(err);
20136
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020137 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020138 VkFramebuffer fb;
20139 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20140 ASSERT_VK_SUCCESS(err);
20141
20142 // Record a single command buffer which issues a pipeline barrier w/
20143 // image memory barrier for the attachment. This detects the previously
20144 // missing tracking of the subpass layout by throwing a validation error
20145 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020146 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 -070020147 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020148 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20149
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020150 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20151 nullptr,
20152 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20153 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20154 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20155 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20156 VK_QUEUE_FAMILY_IGNORED,
20157 VK_QUEUE_FAMILY_IGNORED,
20158 image.handle(),
20159 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020160 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020161 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20162 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020163
20164 vkCmdEndRenderPass(m_commandBuffer->handle());
20165 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020166 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
20168 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20169 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20170 vkDestroyImageView(m_device->device(), view, nullptr);
20171}
20172
20173TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020174 TEST_DESCRIPTION(
20175 "Validate that when an imageView of a depth/stencil image "
20176 "is used as a depth/stencil framebuffer attachment, the "
20177 "aspectMask is ignored and both depth and stencil image "
20178 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020179
Tony Barbour1fa09702017-03-16 12:09:08 -060020180 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020181 VkFormatProperties format_properties;
20182 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20183 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20184 return;
20185 }
20186
20187 m_errorMonitor->ExpectSuccess();
20188
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020189 VkAttachmentDescription attachment = {0,
20190 VK_FORMAT_D32_SFLOAT_S8_UINT,
20191 VK_SAMPLE_COUNT_1_BIT,
20192 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20193 VK_ATTACHMENT_STORE_OP_STORE,
20194 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20195 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20196 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20197 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020198
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020199 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020200
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020201 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020202
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020203 VkSubpassDependency dep = {0,
20204 0,
20205 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20206 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20207 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20208 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20209 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020210
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020211 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020212
20213 VkResult err;
20214 VkRenderPass rp;
20215 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20216 ASSERT_VK_SUCCESS(err);
20217
20218 VkImageObj image(m_device);
20219 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020220 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020221 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020222 ASSERT_TRUE(image.initialized());
20223 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20224
20225 VkImageViewCreateInfo ivci = {
20226 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20227 nullptr,
20228 0,
20229 image.handle(),
20230 VK_IMAGE_VIEW_TYPE_2D,
20231 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020232 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20233 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020234 };
20235 VkImageView view;
20236 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20237 ASSERT_VK_SUCCESS(err);
20238
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020239 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020240 VkFramebuffer fb;
20241 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20242 ASSERT_VK_SUCCESS(err);
20243
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020244 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 -070020245 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020246 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20247
20248 VkImageMemoryBarrier imb = {};
20249 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20250 imb.pNext = nullptr;
20251 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20252 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20253 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20254 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20255 imb.srcQueueFamilyIndex = 0;
20256 imb.dstQueueFamilyIndex = 0;
20257 imb.image = image.handle();
20258 imb.subresourceRange.aspectMask = 0x6;
20259 imb.subresourceRange.baseMipLevel = 0;
20260 imb.subresourceRange.levelCount = 0x1;
20261 imb.subresourceRange.baseArrayLayer = 0;
20262 imb.subresourceRange.layerCount = 0x1;
20263
20264 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020265 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20266 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020267
20268 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020269 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020270 QueueCommandBuffer(false);
20271 m_errorMonitor->VerifyNotFound();
20272
20273 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20274 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20275 vkDestroyImageView(m_device->device(), view, nullptr);
20276}
20277
20278TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020279 TEST_DESCRIPTION(
20280 "Ensure that layout transitions work correctly without "
20281 "errors, when an attachment reference is "
20282 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020283
20284 m_errorMonitor->ExpectSuccess();
20285
Tony Barbour1fa09702017-03-16 12:09:08 -060020286 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287
20288 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020289 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020290
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020291 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020292
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020293 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020294
20295 VkRenderPass rp;
20296 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20297 ASSERT_VK_SUCCESS(err);
20298
20299 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020300 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020301 VkFramebuffer fb;
20302 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20303 ASSERT_VK_SUCCESS(err);
20304
20305 // Record a command buffer which just begins and ends the renderpass. The
20306 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020307 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 -070020308 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020309 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20310 vkCmdEndRenderPass(m_commandBuffer->handle());
20311 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020312 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020313
20314 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20315 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20316}
20317
20318// This is a positive test. No errors are expected.
20319TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020320 TEST_DESCRIPTION(
20321 "Create a stencil-only attachment with a LOAD_OP set to "
20322 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020323 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020324 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020325 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020326 if (!depth_format) {
20327 printf(" No Depth + Stencil format found. Skipped.\n");
20328 return;
20329 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020330 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020331 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020332 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20333 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020334 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20335 return;
20336 }
20337
Tony Barbourf887b162017-03-09 10:06:46 -070020338 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020339 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020340 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020341 VkAttachmentDescription att = {};
20342 VkAttachmentReference ref = {};
20343 att.format = depth_stencil_fmt;
20344 att.samples = VK_SAMPLE_COUNT_1_BIT;
20345 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20346 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20347 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20348 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20349 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20350 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20351
20352 VkClearValue clear;
20353 clear.depthStencil.depth = 1.0;
20354 clear.depthStencil.stencil = 0;
20355 ref.attachment = 0;
20356 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20357
20358 VkSubpassDescription subpass = {};
20359 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20360 subpass.flags = 0;
20361 subpass.inputAttachmentCount = 0;
20362 subpass.pInputAttachments = NULL;
20363 subpass.colorAttachmentCount = 0;
20364 subpass.pColorAttachments = NULL;
20365 subpass.pResolveAttachments = NULL;
20366 subpass.pDepthStencilAttachment = &ref;
20367 subpass.preserveAttachmentCount = 0;
20368 subpass.pPreserveAttachments = NULL;
20369
20370 VkRenderPass rp;
20371 VkRenderPassCreateInfo rp_info = {};
20372 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20373 rp_info.attachmentCount = 1;
20374 rp_info.pAttachments = &att;
20375 rp_info.subpassCount = 1;
20376 rp_info.pSubpasses = &subpass;
20377 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20378 ASSERT_VK_SUCCESS(result);
20379
20380 VkImageView *depthView = m_depthStencil->BindInfo();
20381 VkFramebufferCreateInfo fb_info = {};
20382 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20383 fb_info.pNext = NULL;
20384 fb_info.renderPass = rp;
20385 fb_info.attachmentCount = 1;
20386 fb_info.pAttachments = depthView;
20387 fb_info.width = 100;
20388 fb_info.height = 100;
20389 fb_info.layers = 1;
20390 VkFramebuffer fb;
20391 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20392 ASSERT_VK_SUCCESS(result);
20393
20394 VkRenderPassBeginInfo rpbinfo = {};
20395 rpbinfo.clearValueCount = 1;
20396 rpbinfo.pClearValues = &clear;
20397 rpbinfo.pNext = NULL;
20398 rpbinfo.renderPass = rp;
20399 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20400 rpbinfo.renderArea.extent.width = 100;
20401 rpbinfo.renderArea.extent.height = 100;
20402 rpbinfo.renderArea.offset.x = 0;
20403 rpbinfo.renderArea.offset.y = 0;
20404 rpbinfo.framebuffer = fb;
20405
20406 VkFence fence = {};
20407 VkFenceCreateInfo fence_ci = {};
20408 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20409 fence_ci.pNext = nullptr;
20410 fence_ci.flags = 0;
20411 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20412 ASSERT_VK_SUCCESS(result);
20413
20414 m_commandBuffer->BeginCommandBuffer();
20415 m_commandBuffer->BeginRenderPass(rpbinfo);
20416 m_commandBuffer->EndRenderPass();
20417 m_commandBuffer->EndCommandBuffer();
20418 m_commandBuffer->QueueCommandBuffer(fence);
20419
20420 VkImageObj destImage(m_device);
20421 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 -070020422 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020423 VkImageMemoryBarrier barrier = {};
20424 VkImageSubresourceRange range;
20425 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20426 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20427 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20428 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20429 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20430 barrier.image = m_depthStencil->handle();
20431 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20432 range.baseMipLevel = 0;
20433 range.levelCount = 1;
20434 range.baseArrayLayer = 0;
20435 range.layerCount = 1;
20436 barrier.subresourceRange = range;
20437 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20438 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20439 cmdbuf.BeginCommandBuffer();
20440 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 -070020441 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020442 barrier.srcAccessMask = 0;
20443 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20444 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20445 barrier.image = destImage.handle();
20446 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20447 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 -070020448 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020449 VkImageCopy cregion;
20450 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20451 cregion.srcSubresource.mipLevel = 0;
20452 cregion.srcSubresource.baseArrayLayer = 0;
20453 cregion.srcSubresource.layerCount = 1;
20454 cregion.srcOffset.x = 0;
20455 cregion.srcOffset.y = 0;
20456 cregion.srcOffset.z = 0;
20457 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20458 cregion.dstSubresource.mipLevel = 0;
20459 cregion.dstSubresource.baseArrayLayer = 0;
20460 cregion.dstSubresource.layerCount = 1;
20461 cregion.dstOffset.x = 0;
20462 cregion.dstOffset.y = 0;
20463 cregion.dstOffset.z = 0;
20464 cregion.extent.width = 100;
20465 cregion.extent.height = 100;
20466 cregion.extent.depth = 1;
20467 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020468 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020469 cmdbuf.EndCommandBuffer();
20470
20471 VkSubmitInfo submit_info;
20472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20473 submit_info.pNext = NULL;
20474 submit_info.waitSemaphoreCount = 0;
20475 submit_info.pWaitSemaphores = NULL;
20476 submit_info.pWaitDstStageMask = NULL;
20477 submit_info.commandBufferCount = 1;
20478 submit_info.pCommandBuffers = &cmdbuf.handle();
20479 submit_info.signalSemaphoreCount = 0;
20480 submit_info.pSignalSemaphores = NULL;
20481
20482 m_errorMonitor->ExpectSuccess();
20483 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20484 m_errorMonitor->VerifyNotFound();
20485
20486 vkQueueWaitIdle(m_device->m_queue);
20487 vkDestroyFence(m_device->device(), fence, nullptr);
20488 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20489 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20490}
20491
20492// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020493TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20494 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20495
20496 m_errorMonitor->ExpectSuccess();
20497
Tony Barbour1fa09702017-03-16 12:09:08 -060020498 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020499 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020500 if (!depth_format) {
20501 printf(" No Depth + Stencil format found. Skipped.\n");
20502 return;
20503 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20505
20506 VkImageMemoryBarrier img_barrier = {};
20507 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20508 img_barrier.pNext = NULL;
20509 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20510 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20511 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20512 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20513 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20514 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20515 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20516 img_barrier.subresourceRange.baseArrayLayer = 0;
20517 img_barrier.subresourceRange.baseMipLevel = 0;
20518 img_barrier.subresourceRange.layerCount = 1;
20519 img_barrier.subresourceRange.levelCount = 1;
20520
20521 {
20522 VkImageObj img_color(m_device);
20523 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20524 ASSERT_TRUE(img_color.initialized());
20525
20526 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020527 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 -070020528 ASSERT_TRUE(img_ds1.initialized());
20529
20530 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020531 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 -070020532 ASSERT_TRUE(img_ds2.initialized());
20533
20534 VkImageObj img_xfer_src(m_device);
20535 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20536 ASSERT_TRUE(img_xfer_src.initialized());
20537
20538 VkImageObj img_xfer_dst(m_device);
20539 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20540 ASSERT_TRUE(img_xfer_dst.initialized());
20541
20542 VkImageObj img_sampled(m_device);
20543 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20544 ASSERT_TRUE(img_sampled.initialized());
20545
20546 VkImageObj img_input(m_device);
20547 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20548 ASSERT_TRUE(img_input.initialized());
20549
20550 const struct {
20551 VkImageObj &image_obj;
20552 VkImageLayout old_layout;
20553 VkImageLayout new_layout;
20554 } buffer_layouts[] = {
20555 // clang-format off
20556 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20557 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20558 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20559 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20560 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20561 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20562 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20563 // clang-format on
20564 };
20565 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20566
20567 m_commandBuffer->BeginCommandBuffer();
20568 for (uint32_t i = 0; i < layout_count; ++i) {
20569 img_barrier.image = buffer_layouts[i].image_obj.handle();
20570 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20571 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20572 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20573 : VK_IMAGE_ASPECT_COLOR_BIT;
20574
20575 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20576 img_barrier.newLayout = buffer_layouts[i].new_layout;
20577 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20578 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20579
20580 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20581 img_barrier.newLayout = buffer_layouts[i].old_layout;
20582 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20583 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20584 }
20585 m_commandBuffer->EndCommandBuffer();
20586
20587 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20588 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20589 }
20590 m_errorMonitor->VerifyNotFound();
20591}
20592
20593// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020594TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20595 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20596
20597 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020598 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020599
20600 VkEvent event;
20601 VkEventCreateInfo event_create_info{};
20602 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20603 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20604
20605 VkCommandPool command_pool;
20606 VkCommandPoolCreateInfo pool_create_info{};
20607 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20608 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20609 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20610 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20611
20612 VkCommandBuffer command_buffer;
20613 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20614 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20615 command_buffer_allocate_info.commandPool = command_pool;
20616 command_buffer_allocate_info.commandBufferCount = 1;
20617 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20618 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20619
20620 VkQueue queue = VK_NULL_HANDLE;
20621 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20622
20623 {
20624 VkCommandBufferBeginInfo begin_info{};
20625 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20626 vkBeginCommandBuffer(command_buffer, &begin_info);
20627
20628 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 -070020629 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020630 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20631 vkEndCommandBuffer(command_buffer);
20632 }
20633 {
20634 VkSubmitInfo submit_info{};
20635 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20636 submit_info.commandBufferCount = 1;
20637 submit_info.pCommandBuffers = &command_buffer;
20638 submit_info.signalSemaphoreCount = 0;
20639 submit_info.pSignalSemaphores = nullptr;
20640 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20641 }
20642 { vkSetEvent(m_device->device(), event); }
20643
20644 vkQueueWaitIdle(queue);
20645
20646 vkDestroyEvent(m_device->device(), event, nullptr);
20647 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20648 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20649
20650 m_errorMonitor->VerifyNotFound();
20651}
20652// This is a positive test. No errors should be generated.
20653TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20654 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20655
Tony Barbour1fa09702017-03-16 12:09:08 -060020656 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020657 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020658
20659 m_errorMonitor->ExpectSuccess();
20660
20661 VkQueryPool query_pool;
20662 VkQueryPoolCreateInfo query_pool_create_info{};
20663 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20664 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20665 query_pool_create_info.queryCount = 1;
20666 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20667
20668 VkCommandPool command_pool;
20669 VkCommandPoolCreateInfo pool_create_info{};
20670 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20671 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20672 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20673 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20674
20675 VkCommandBuffer command_buffer;
20676 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20677 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20678 command_buffer_allocate_info.commandPool = command_pool;
20679 command_buffer_allocate_info.commandBufferCount = 1;
20680 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20681 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20682
20683 VkCommandBuffer secondary_command_buffer;
20684 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20685 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20686
20687 VkQueue queue = VK_NULL_HANDLE;
20688 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20689
20690 uint32_t qfi = 0;
20691 VkBufferCreateInfo buff_create_info = {};
20692 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20693 buff_create_info.size = 1024;
20694 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20695 buff_create_info.queueFamilyIndexCount = 1;
20696 buff_create_info.pQueueFamilyIndices = &qfi;
20697
20698 VkResult err;
20699 VkBuffer buffer;
20700 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20701 ASSERT_VK_SUCCESS(err);
20702 VkMemoryAllocateInfo mem_alloc = {};
20703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20704 mem_alloc.pNext = NULL;
20705 mem_alloc.allocationSize = 1024;
20706 mem_alloc.memoryTypeIndex = 0;
20707
20708 VkMemoryRequirements memReqs;
20709 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20710 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20711 if (!pass) {
20712 vkDestroyBuffer(m_device->device(), buffer, NULL);
20713 return;
20714 }
20715
20716 VkDeviceMemory mem;
20717 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20718 ASSERT_VK_SUCCESS(err);
20719 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20720 ASSERT_VK_SUCCESS(err);
20721
20722 VkCommandBufferInheritanceInfo hinfo = {};
20723 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20724 hinfo.renderPass = VK_NULL_HANDLE;
20725 hinfo.subpass = 0;
20726 hinfo.framebuffer = VK_NULL_HANDLE;
20727 hinfo.occlusionQueryEnable = VK_FALSE;
20728 hinfo.queryFlags = 0;
20729 hinfo.pipelineStatistics = 0;
20730
20731 {
20732 VkCommandBufferBeginInfo begin_info{};
20733 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20734 begin_info.pInheritanceInfo = &hinfo;
20735 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20736
20737 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20738 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20739
20740 vkEndCommandBuffer(secondary_command_buffer);
20741
20742 begin_info.pInheritanceInfo = nullptr;
20743 vkBeginCommandBuffer(command_buffer, &begin_info);
20744
20745 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20746 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20747
20748 vkEndCommandBuffer(command_buffer);
20749 }
20750 {
20751 VkSubmitInfo submit_info{};
20752 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20753 submit_info.commandBufferCount = 1;
20754 submit_info.pCommandBuffers = &command_buffer;
20755 submit_info.signalSemaphoreCount = 0;
20756 submit_info.pSignalSemaphores = nullptr;
20757 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20758 }
20759
20760 vkQueueWaitIdle(queue);
20761
20762 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20763 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20764 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20765 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20766 vkDestroyBuffer(m_device->device(), buffer, NULL);
20767 vkFreeMemory(m_device->device(), mem, NULL);
20768
20769 m_errorMonitor->VerifyNotFound();
20770}
20771
20772// This is a positive test. No errors should be generated.
20773TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20774 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20775
Tony Barbour1fa09702017-03-16 12:09:08 -060020776 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020777 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020778
20779 m_errorMonitor->ExpectSuccess();
20780
20781 VkQueryPool query_pool;
20782 VkQueryPoolCreateInfo query_pool_create_info{};
20783 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20784 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20785 query_pool_create_info.queryCount = 1;
20786 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20787
20788 VkCommandPool command_pool;
20789 VkCommandPoolCreateInfo pool_create_info{};
20790 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20791 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20792 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20793 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20794
20795 VkCommandBuffer command_buffer[2];
20796 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20797 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20798 command_buffer_allocate_info.commandPool = command_pool;
20799 command_buffer_allocate_info.commandBufferCount = 2;
20800 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20801 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20802
20803 VkQueue queue = VK_NULL_HANDLE;
20804 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20805
20806 uint32_t qfi = 0;
20807 VkBufferCreateInfo buff_create_info = {};
20808 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20809 buff_create_info.size = 1024;
20810 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20811 buff_create_info.queueFamilyIndexCount = 1;
20812 buff_create_info.pQueueFamilyIndices = &qfi;
20813
20814 VkResult err;
20815 VkBuffer buffer;
20816 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20817 ASSERT_VK_SUCCESS(err);
20818 VkMemoryAllocateInfo mem_alloc = {};
20819 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20820 mem_alloc.pNext = NULL;
20821 mem_alloc.allocationSize = 1024;
20822 mem_alloc.memoryTypeIndex = 0;
20823
20824 VkMemoryRequirements memReqs;
20825 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20826 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20827 if (!pass) {
20828 vkDestroyBuffer(m_device->device(), buffer, NULL);
20829 return;
20830 }
20831
20832 VkDeviceMemory mem;
20833 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20834 ASSERT_VK_SUCCESS(err);
20835 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20836 ASSERT_VK_SUCCESS(err);
20837
20838 {
20839 VkCommandBufferBeginInfo begin_info{};
20840 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20841 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20842
20843 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20844 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20845
20846 vkEndCommandBuffer(command_buffer[0]);
20847
20848 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20849
20850 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20851
20852 vkEndCommandBuffer(command_buffer[1]);
20853 }
20854 {
20855 VkSubmitInfo submit_info{};
20856 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20857 submit_info.commandBufferCount = 2;
20858 submit_info.pCommandBuffers = command_buffer;
20859 submit_info.signalSemaphoreCount = 0;
20860 submit_info.pSignalSemaphores = nullptr;
20861 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20862 }
20863
20864 vkQueueWaitIdle(queue);
20865
20866 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20867 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20868 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20869 vkDestroyBuffer(m_device->device(), buffer, NULL);
20870 vkFreeMemory(m_device->device(), mem, NULL);
20871
20872 m_errorMonitor->VerifyNotFound();
20873}
20874
Tony Barbourc46924f2016-11-04 11:49:52 -060020875TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020876 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20877
Tony Barbour1fa09702017-03-16 12:09:08 -060020878 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020879 VkEvent event;
20880 VkEventCreateInfo event_create_info{};
20881 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20882 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20883
20884 VkCommandPool command_pool;
20885 VkCommandPoolCreateInfo pool_create_info{};
20886 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20887 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20888 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20889 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20890
20891 VkCommandBuffer command_buffer;
20892 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20893 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20894 command_buffer_allocate_info.commandPool = command_pool;
20895 command_buffer_allocate_info.commandBufferCount = 1;
20896 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20897 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20898
20899 VkQueue queue = VK_NULL_HANDLE;
20900 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20901
20902 {
20903 VkCommandBufferBeginInfo begin_info{};
20904 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20905 vkBeginCommandBuffer(command_buffer, &begin_info);
20906
20907 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020908 vkEndCommandBuffer(command_buffer);
20909 }
20910 {
20911 VkSubmitInfo submit_info{};
20912 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20913 submit_info.commandBufferCount = 1;
20914 submit_info.pCommandBuffers = &command_buffer;
20915 submit_info.signalSemaphoreCount = 0;
20916 submit_info.pSignalSemaphores = nullptr;
20917 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20918 }
20919 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20921 "that is already in use by a "
20922 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020923 vkSetEvent(m_device->device(), event);
20924 m_errorMonitor->VerifyFound();
20925 }
20926
20927 vkQueueWaitIdle(queue);
20928
20929 vkDestroyEvent(m_device->device(), event, nullptr);
20930 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20931 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20932}
20933
20934// This is a positive test. No errors should be generated.
20935TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020936 TEST_DESCRIPTION(
20937 "Two command buffers with two separate fences are each "
20938 "run through a Submit & WaitForFences cycle 3 times. This "
20939 "previously revealed a bug so running this positive test "
20940 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020941 m_errorMonitor->ExpectSuccess();
20942
Tony Barbour1fa09702017-03-16 12:09:08 -060020943 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020944 VkQueue queue = VK_NULL_HANDLE;
20945 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20946
20947 static const uint32_t NUM_OBJECTS = 2;
20948 static const uint32_t NUM_FRAMES = 3;
20949 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20950 VkFence fences[NUM_OBJECTS] = {};
20951
20952 VkCommandPool cmd_pool;
20953 VkCommandPoolCreateInfo cmd_pool_ci = {};
20954 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20955 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20956 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20957 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20958 ASSERT_VK_SUCCESS(err);
20959
20960 VkCommandBufferAllocateInfo cmd_buf_info = {};
20961 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20962 cmd_buf_info.commandPool = cmd_pool;
20963 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20964 cmd_buf_info.commandBufferCount = 1;
20965
20966 VkFenceCreateInfo fence_ci = {};
20967 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20968 fence_ci.pNext = nullptr;
20969 fence_ci.flags = 0;
20970
20971 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20972 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20973 ASSERT_VK_SUCCESS(err);
20974 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20975 ASSERT_VK_SUCCESS(err);
20976 }
20977
20978 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20979 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20980 // Create empty cmd buffer
20981 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20982 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20983
20984 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20985 ASSERT_VK_SUCCESS(err);
20986 err = vkEndCommandBuffer(cmd_buffers[obj]);
20987 ASSERT_VK_SUCCESS(err);
20988
20989 VkSubmitInfo submit_info = {};
20990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20991 submit_info.commandBufferCount = 1;
20992 submit_info.pCommandBuffers = &cmd_buffers[obj];
20993 // Submit cmd buffer and wait for fence
20994 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20995 ASSERT_VK_SUCCESS(err);
20996 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20997 ASSERT_VK_SUCCESS(err);
20998 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20999 ASSERT_VK_SUCCESS(err);
21000 }
21001 }
21002 m_errorMonitor->VerifyNotFound();
21003 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21004 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21005 vkDestroyFence(m_device->device(), fences[i], nullptr);
21006 }
21007}
21008// This is a positive test. No errors should be generated.
21009TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021010 TEST_DESCRIPTION(
21011 "Two command buffers, each in a separate QueueSubmit call "
21012 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021013
Tony Barbour1fa09702017-03-16 12:09:08 -060021014 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021015 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021016
21017 m_errorMonitor->ExpectSuccess();
21018
21019 VkSemaphore semaphore;
21020 VkSemaphoreCreateInfo semaphore_create_info{};
21021 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21022 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21023
21024 VkCommandPool command_pool;
21025 VkCommandPoolCreateInfo pool_create_info{};
21026 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21027 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21028 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21029 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21030
21031 VkCommandBuffer command_buffer[2];
21032 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21033 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21034 command_buffer_allocate_info.commandPool = command_pool;
21035 command_buffer_allocate_info.commandBufferCount = 2;
21036 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21037 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21038
21039 VkQueue queue = VK_NULL_HANDLE;
21040 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21041
21042 {
21043 VkCommandBufferBeginInfo begin_info{};
21044 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21045 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21046
21047 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 -070021048 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021049
21050 VkViewport viewport{};
21051 viewport.maxDepth = 1.0f;
21052 viewport.minDepth = 0.0f;
21053 viewport.width = 512;
21054 viewport.height = 512;
21055 viewport.x = 0;
21056 viewport.y = 0;
21057 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21058 vkEndCommandBuffer(command_buffer[0]);
21059 }
21060 {
21061 VkCommandBufferBeginInfo begin_info{};
21062 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21063 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21064
21065 VkViewport viewport{};
21066 viewport.maxDepth = 1.0f;
21067 viewport.minDepth = 0.0f;
21068 viewport.width = 512;
21069 viewport.height = 512;
21070 viewport.x = 0;
21071 viewport.y = 0;
21072 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21073 vkEndCommandBuffer(command_buffer[1]);
21074 }
21075 {
21076 VkSubmitInfo submit_info{};
21077 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21078 submit_info.commandBufferCount = 1;
21079 submit_info.pCommandBuffers = &command_buffer[0];
21080 submit_info.signalSemaphoreCount = 1;
21081 submit_info.pSignalSemaphores = &semaphore;
21082 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21083 }
21084 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021085 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021086 VkSubmitInfo submit_info{};
21087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21088 submit_info.commandBufferCount = 1;
21089 submit_info.pCommandBuffers = &command_buffer[1];
21090 submit_info.waitSemaphoreCount = 1;
21091 submit_info.pWaitSemaphores = &semaphore;
21092 submit_info.pWaitDstStageMask = flags;
21093 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21094 }
21095
21096 vkQueueWaitIdle(m_device->m_queue);
21097
21098 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21099 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21100 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21101
21102 m_errorMonitor->VerifyNotFound();
21103}
21104
21105// This is a positive test. No errors should be generated.
21106TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021107 TEST_DESCRIPTION(
21108 "Two command buffers, each in a separate QueueSubmit call "
21109 "submitted on separate queues, the second having a fence"
21110 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021111
Tony Barbour1fa09702017-03-16 12:09:08 -060021112 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021113 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021114
21115 m_errorMonitor->ExpectSuccess();
21116
21117 VkFence fence;
21118 VkFenceCreateInfo fence_create_info{};
21119 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21120 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21121
21122 VkSemaphore semaphore;
21123 VkSemaphoreCreateInfo semaphore_create_info{};
21124 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21125 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21126
21127 VkCommandPool command_pool;
21128 VkCommandPoolCreateInfo pool_create_info{};
21129 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21130 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21131 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21132 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21133
21134 VkCommandBuffer command_buffer[2];
21135 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21136 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21137 command_buffer_allocate_info.commandPool = command_pool;
21138 command_buffer_allocate_info.commandBufferCount = 2;
21139 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21140 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21141
21142 VkQueue queue = VK_NULL_HANDLE;
21143 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21144
21145 {
21146 VkCommandBufferBeginInfo begin_info{};
21147 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21148 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21149
21150 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 -070021151 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021152
21153 VkViewport viewport{};
21154 viewport.maxDepth = 1.0f;
21155 viewport.minDepth = 0.0f;
21156 viewport.width = 512;
21157 viewport.height = 512;
21158 viewport.x = 0;
21159 viewport.y = 0;
21160 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21161 vkEndCommandBuffer(command_buffer[0]);
21162 }
21163 {
21164 VkCommandBufferBeginInfo begin_info{};
21165 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21166 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21167
21168 VkViewport viewport{};
21169 viewport.maxDepth = 1.0f;
21170 viewport.minDepth = 0.0f;
21171 viewport.width = 512;
21172 viewport.height = 512;
21173 viewport.x = 0;
21174 viewport.y = 0;
21175 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21176 vkEndCommandBuffer(command_buffer[1]);
21177 }
21178 {
21179 VkSubmitInfo submit_info{};
21180 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21181 submit_info.commandBufferCount = 1;
21182 submit_info.pCommandBuffers = &command_buffer[0];
21183 submit_info.signalSemaphoreCount = 1;
21184 submit_info.pSignalSemaphores = &semaphore;
21185 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21186 }
21187 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021188 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021189 VkSubmitInfo submit_info{};
21190 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21191 submit_info.commandBufferCount = 1;
21192 submit_info.pCommandBuffers = &command_buffer[1];
21193 submit_info.waitSemaphoreCount = 1;
21194 submit_info.pWaitSemaphores = &semaphore;
21195 submit_info.pWaitDstStageMask = flags;
21196 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21197 }
21198
21199 vkQueueWaitIdle(m_device->m_queue);
21200
21201 vkDestroyFence(m_device->device(), fence, nullptr);
21202 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21203 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21204 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21205
21206 m_errorMonitor->VerifyNotFound();
21207}
21208
21209// This is a positive test. No errors should be generated.
21210TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021211 TEST_DESCRIPTION(
21212 "Two command buffers, each in a separate QueueSubmit call "
21213 "submitted on separate queues, the second having a fence"
21214 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021215
Tony Barbour1fa09702017-03-16 12:09:08 -060021216 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021217 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021218
21219 m_errorMonitor->ExpectSuccess();
21220
21221 VkFence fence;
21222 VkFenceCreateInfo fence_create_info{};
21223 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21224 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21225
21226 VkSemaphore semaphore;
21227 VkSemaphoreCreateInfo semaphore_create_info{};
21228 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21229 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21230
21231 VkCommandPool command_pool;
21232 VkCommandPoolCreateInfo pool_create_info{};
21233 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21234 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21235 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21236 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21237
21238 VkCommandBuffer command_buffer[2];
21239 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21240 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21241 command_buffer_allocate_info.commandPool = command_pool;
21242 command_buffer_allocate_info.commandBufferCount = 2;
21243 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21244 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21245
21246 VkQueue queue = VK_NULL_HANDLE;
21247 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21248
21249 {
21250 VkCommandBufferBeginInfo begin_info{};
21251 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21252 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21253
21254 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 -070021255 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021256
21257 VkViewport viewport{};
21258 viewport.maxDepth = 1.0f;
21259 viewport.minDepth = 0.0f;
21260 viewport.width = 512;
21261 viewport.height = 512;
21262 viewport.x = 0;
21263 viewport.y = 0;
21264 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21265 vkEndCommandBuffer(command_buffer[0]);
21266 }
21267 {
21268 VkCommandBufferBeginInfo begin_info{};
21269 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21270 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21271
21272 VkViewport viewport{};
21273 viewport.maxDepth = 1.0f;
21274 viewport.minDepth = 0.0f;
21275 viewport.width = 512;
21276 viewport.height = 512;
21277 viewport.x = 0;
21278 viewport.y = 0;
21279 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21280 vkEndCommandBuffer(command_buffer[1]);
21281 }
21282 {
21283 VkSubmitInfo submit_info{};
21284 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21285 submit_info.commandBufferCount = 1;
21286 submit_info.pCommandBuffers = &command_buffer[0];
21287 submit_info.signalSemaphoreCount = 1;
21288 submit_info.pSignalSemaphores = &semaphore;
21289 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21290 }
21291 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021292 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021293 VkSubmitInfo submit_info{};
21294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21295 submit_info.commandBufferCount = 1;
21296 submit_info.pCommandBuffers = &command_buffer[1];
21297 submit_info.waitSemaphoreCount = 1;
21298 submit_info.pWaitSemaphores = &semaphore;
21299 submit_info.pWaitDstStageMask = flags;
21300 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21301 }
21302
21303 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21304 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21305
21306 vkDestroyFence(m_device->device(), fence, nullptr);
21307 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21308 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21309 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21310
21311 m_errorMonitor->VerifyNotFound();
21312}
21313
21314TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021316 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021317 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021318 return;
21319 }
21320
21321 VkResult err;
21322
21323 m_errorMonitor->ExpectSuccess();
21324
21325 VkQueue q0 = m_device->m_queue;
21326 VkQueue q1 = nullptr;
21327 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21328 ASSERT_NE(q1, nullptr);
21329
21330 // An (empty) command buffer. We must have work in the first submission --
21331 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021332 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021333 VkCommandPool pool;
21334 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21335 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21337 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021338 VkCommandBuffer cb;
21339 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21340 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021341 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342 err = vkBeginCommandBuffer(cb, &cbbi);
21343 ASSERT_VK_SUCCESS(err);
21344 err = vkEndCommandBuffer(cb);
21345 ASSERT_VK_SUCCESS(err);
21346
21347 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021348 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021349 VkSemaphore s;
21350 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21351 ASSERT_VK_SUCCESS(err);
21352
21353 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021354 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021355
21356 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21357 ASSERT_VK_SUCCESS(err);
21358
21359 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021360 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021361 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021362
21363 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21364 ASSERT_VK_SUCCESS(err);
21365
21366 // Wait for q0 idle
21367 err = vkQueueWaitIdle(q0);
21368 ASSERT_VK_SUCCESS(err);
21369
21370 // Command buffer should have been completed (it was on q0); reset the pool.
21371 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21372
21373 m_errorMonitor->VerifyNotFound();
21374
21375 // Force device completely idle and clean up resources
21376 vkDeviceWaitIdle(m_device->device());
21377 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21378 vkDestroySemaphore(m_device->device(), s, nullptr);
21379}
21380
21381// This is a positive test. No errors should be generated.
21382TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021383 TEST_DESCRIPTION(
21384 "Two command buffers, each in a separate QueueSubmit call "
21385 "submitted on separate queues, the second having a fence, "
21386 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021387
Tony Barbour1fa09702017-03-16 12:09:08 -060021388 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021389 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021390
21391 m_errorMonitor->ExpectSuccess();
21392
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021393 VkFence fence;
21394 VkFenceCreateInfo fence_create_info{};
21395 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21396 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21397
21398 VkSemaphore semaphore;
21399 VkSemaphoreCreateInfo semaphore_create_info{};
21400 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21401 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21402
21403 VkCommandPool command_pool;
21404 VkCommandPoolCreateInfo pool_create_info{};
21405 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21406 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21407 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21408 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21409
21410 VkCommandBuffer command_buffer[2];
21411 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21412 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21413 command_buffer_allocate_info.commandPool = command_pool;
21414 command_buffer_allocate_info.commandBufferCount = 2;
21415 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21416 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21417
21418 VkQueue queue = VK_NULL_HANDLE;
21419 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21420
21421 {
21422 VkCommandBufferBeginInfo begin_info{};
21423 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21424 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21425
21426 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 -070021427 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021428
21429 VkViewport viewport{};
21430 viewport.maxDepth = 1.0f;
21431 viewport.minDepth = 0.0f;
21432 viewport.width = 512;
21433 viewport.height = 512;
21434 viewport.x = 0;
21435 viewport.y = 0;
21436 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21437 vkEndCommandBuffer(command_buffer[0]);
21438 }
21439 {
21440 VkCommandBufferBeginInfo begin_info{};
21441 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21442 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21443
21444 VkViewport viewport{};
21445 viewport.maxDepth = 1.0f;
21446 viewport.minDepth = 0.0f;
21447 viewport.width = 512;
21448 viewport.height = 512;
21449 viewport.x = 0;
21450 viewport.y = 0;
21451 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21452 vkEndCommandBuffer(command_buffer[1]);
21453 }
21454 {
21455 VkSubmitInfo submit_info{};
21456 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21457 submit_info.commandBufferCount = 1;
21458 submit_info.pCommandBuffers = &command_buffer[0];
21459 submit_info.signalSemaphoreCount = 1;
21460 submit_info.pSignalSemaphores = &semaphore;
21461 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21462 }
21463 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021464 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021465 VkSubmitInfo submit_info{};
21466 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21467 submit_info.commandBufferCount = 1;
21468 submit_info.pCommandBuffers = &command_buffer[1];
21469 submit_info.waitSemaphoreCount = 1;
21470 submit_info.pWaitSemaphores = &semaphore;
21471 submit_info.pWaitDstStageMask = flags;
21472 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21473 }
21474
21475 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21476
21477 vkDestroyFence(m_device->device(), fence, nullptr);
21478 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21479 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21480 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21481
21482 m_errorMonitor->VerifyNotFound();
21483}
21484
21485// This is a positive test. No errors should be generated.
21486TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021487 TEST_DESCRIPTION(
21488 "Two command buffers, each in a separate QueueSubmit call "
21489 "on the same queue, sharing a signal/wait semaphore, the "
21490 "second having a fence, "
21491 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021492
21493 m_errorMonitor->ExpectSuccess();
21494
Tony Barbour1fa09702017-03-16 12:09:08 -060021495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021496 VkFence fence;
21497 VkFenceCreateInfo fence_create_info{};
21498 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21499 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21500
21501 VkSemaphore semaphore;
21502 VkSemaphoreCreateInfo semaphore_create_info{};
21503 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21504 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21505
21506 VkCommandPool command_pool;
21507 VkCommandPoolCreateInfo pool_create_info{};
21508 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21509 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21510 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21511 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21512
21513 VkCommandBuffer command_buffer[2];
21514 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21515 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21516 command_buffer_allocate_info.commandPool = command_pool;
21517 command_buffer_allocate_info.commandBufferCount = 2;
21518 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21519 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21520
21521 {
21522 VkCommandBufferBeginInfo begin_info{};
21523 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21524 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21525
21526 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 -070021527 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021528
21529 VkViewport viewport{};
21530 viewport.maxDepth = 1.0f;
21531 viewport.minDepth = 0.0f;
21532 viewport.width = 512;
21533 viewport.height = 512;
21534 viewport.x = 0;
21535 viewport.y = 0;
21536 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21537 vkEndCommandBuffer(command_buffer[0]);
21538 }
21539 {
21540 VkCommandBufferBeginInfo begin_info{};
21541 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21542 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21543
21544 VkViewport viewport{};
21545 viewport.maxDepth = 1.0f;
21546 viewport.minDepth = 0.0f;
21547 viewport.width = 512;
21548 viewport.height = 512;
21549 viewport.x = 0;
21550 viewport.y = 0;
21551 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21552 vkEndCommandBuffer(command_buffer[1]);
21553 }
21554 {
21555 VkSubmitInfo submit_info{};
21556 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21557 submit_info.commandBufferCount = 1;
21558 submit_info.pCommandBuffers = &command_buffer[0];
21559 submit_info.signalSemaphoreCount = 1;
21560 submit_info.pSignalSemaphores = &semaphore;
21561 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21562 }
21563 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021564 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021565 VkSubmitInfo submit_info{};
21566 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21567 submit_info.commandBufferCount = 1;
21568 submit_info.pCommandBuffers = &command_buffer[1];
21569 submit_info.waitSemaphoreCount = 1;
21570 submit_info.pWaitSemaphores = &semaphore;
21571 submit_info.pWaitDstStageMask = flags;
21572 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21573 }
21574
21575 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21576
21577 vkDestroyFence(m_device->device(), fence, nullptr);
21578 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21579 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21580 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21581
21582 m_errorMonitor->VerifyNotFound();
21583}
21584
21585// This is a positive test. No errors should be generated.
21586TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021587 TEST_DESCRIPTION(
21588 "Two command buffers, each in a separate QueueSubmit call "
21589 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21590 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021591
21592 m_errorMonitor->ExpectSuccess();
21593
Tony Barbour1fa09702017-03-16 12:09:08 -060021594 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021595 VkFence fence;
21596 VkFenceCreateInfo fence_create_info{};
21597 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21598 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21599
21600 VkCommandPool command_pool;
21601 VkCommandPoolCreateInfo pool_create_info{};
21602 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21603 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21604 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21605 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21606
21607 VkCommandBuffer command_buffer[2];
21608 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21609 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21610 command_buffer_allocate_info.commandPool = command_pool;
21611 command_buffer_allocate_info.commandBufferCount = 2;
21612 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21613 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21614
21615 {
21616 VkCommandBufferBeginInfo begin_info{};
21617 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21618 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21619
21620 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 -070021621 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021622
21623 VkViewport viewport{};
21624 viewport.maxDepth = 1.0f;
21625 viewport.minDepth = 0.0f;
21626 viewport.width = 512;
21627 viewport.height = 512;
21628 viewport.x = 0;
21629 viewport.y = 0;
21630 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21631 vkEndCommandBuffer(command_buffer[0]);
21632 }
21633 {
21634 VkCommandBufferBeginInfo begin_info{};
21635 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21636 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21637
21638 VkViewport viewport{};
21639 viewport.maxDepth = 1.0f;
21640 viewport.minDepth = 0.0f;
21641 viewport.width = 512;
21642 viewport.height = 512;
21643 viewport.x = 0;
21644 viewport.y = 0;
21645 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21646 vkEndCommandBuffer(command_buffer[1]);
21647 }
21648 {
21649 VkSubmitInfo submit_info{};
21650 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21651 submit_info.commandBufferCount = 1;
21652 submit_info.pCommandBuffers = &command_buffer[0];
21653 submit_info.signalSemaphoreCount = 0;
21654 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21655 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21656 }
21657 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021658 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021659 VkSubmitInfo submit_info{};
21660 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21661 submit_info.commandBufferCount = 1;
21662 submit_info.pCommandBuffers = &command_buffer[1];
21663 submit_info.waitSemaphoreCount = 0;
21664 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21665 submit_info.pWaitDstStageMask = flags;
21666 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21667 }
21668
21669 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21670
21671 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21672 ASSERT_VK_SUCCESS(err);
21673
21674 vkDestroyFence(m_device->device(), fence, nullptr);
21675 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21676 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21677
21678 m_errorMonitor->VerifyNotFound();
21679}
21680
21681// This is a positive test. No errors should be generated.
21682TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021683 TEST_DESCRIPTION(
21684 "Two command buffers, each in a separate QueueSubmit call "
21685 "on the same queue, the second having a fence, followed "
21686 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021687
21688 m_errorMonitor->ExpectSuccess();
21689
Tony Barbour1fa09702017-03-16 12:09:08 -060021690 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021691 VkFence fence;
21692 VkFenceCreateInfo fence_create_info{};
21693 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21694 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21695
21696 VkCommandPool command_pool;
21697 VkCommandPoolCreateInfo pool_create_info{};
21698 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21699 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21700 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21701 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21702
21703 VkCommandBuffer command_buffer[2];
21704 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21705 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21706 command_buffer_allocate_info.commandPool = command_pool;
21707 command_buffer_allocate_info.commandBufferCount = 2;
21708 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21709 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21710
21711 {
21712 VkCommandBufferBeginInfo begin_info{};
21713 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21714 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21715
21716 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 -070021717 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021718
21719 VkViewport viewport{};
21720 viewport.maxDepth = 1.0f;
21721 viewport.minDepth = 0.0f;
21722 viewport.width = 512;
21723 viewport.height = 512;
21724 viewport.x = 0;
21725 viewport.y = 0;
21726 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21727 vkEndCommandBuffer(command_buffer[0]);
21728 }
21729 {
21730 VkCommandBufferBeginInfo begin_info{};
21731 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21732 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21733
21734 VkViewport viewport{};
21735 viewport.maxDepth = 1.0f;
21736 viewport.minDepth = 0.0f;
21737 viewport.width = 512;
21738 viewport.height = 512;
21739 viewport.x = 0;
21740 viewport.y = 0;
21741 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21742 vkEndCommandBuffer(command_buffer[1]);
21743 }
21744 {
21745 VkSubmitInfo submit_info{};
21746 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21747 submit_info.commandBufferCount = 1;
21748 submit_info.pCommandBuffers = &command_buffer[0];
21749 submit_info.signalSemaphoreCount = 0;
21750 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21751 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21752 }
21753 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021754 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021755 VkSubmitInfo submit_info{};
21756 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21757 submit_info.commandBufferCount = 1;
21758 submit_info.pCommandBuffers = &command_buffer[1];
21759 submit_info.waitSemaphoreCount = 0;
21760 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21761 submit_info.pWaitDstStageMask = flags;
21762 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21763 }
21764
21765 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21766
21767 vkDestroyFence(m_device->device(), fence, nullptr);
21768 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21769 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21770
21771 m_errorMonitor->VerifyNotFound();
21772}
21773
21774// This is a positive test. No errors should be generated.
21775TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021776 TEST_DESCRIPTION(
21777 "Two command buffers each in a separate SubmitInfo sent in a single "
21778 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021779 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021780
21781 m_errorMonitor->ExpectSuccess();
21782
21783 VkFence fence;
21784 VkFenceCreateInfo fence_create_info{};
21785 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21786 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21787
21788 VkSemaphore semaphore;
21789 VkSemaphoreCreateInfo semaphore_create_info{};
21790 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21791 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21792
21793 VkCommandPool command_pool;
21794 VkCommandPoolCreateInfo pool_create_info{};
21795 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21796 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21797 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21798 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21799
21800 VkCommandBuffer command_buffer[2];
21801 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21802 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21803 command_buffer_allocate_info.commandPool = command_pool;
21804 command_buffer_allocate_info.commandBufferCount = 2;
21805 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21806 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21807
21808 {
21809 VkCommandBufferBeginInfo begin_info{};
21810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21812
21813 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 -070021814 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021815
21816 VkViewport viewport{};
21817 viewport.maxDepth = 1.0f;
21818 viewport.minDepth = 0.0f;
21819 viewport.width = 512;
21820 viewport.height = 512;
21821 viewport.x = 0;
21822 viewport.y = 0;
21823 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21824 vkEndCommandBuffer(command_buffer[0]);
21825 }
21826 {
21827 VkCommandBufferBeginInfo begin_info{};
21828 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21829 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21830
21831 VkViewport viewport{};
21832 viewport.maxDepth = 1.0f;
21833 viewport.minDepth = 0.0f;
21834 viewport.width = 512;
21835 viewport.height = 512;
21836 viewport.x = 0;
21837 viewport.y = 0;
21838 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21839 vkEndCommandBuffer(command_buffer[1]);
21840 }
21841 {
21842 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021843 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021844
21845 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21846 submit_info[0].pNext = NULL;
21847 submit_info[0].commandBufferCount = 1;
21848 submit_info[0].pCommandBuffers = &command_buffer[0];
21849 submit_info[0].signalSemaphoreCount = 1;
21850 submit_info[0].pSignalSemaphores = &semaphore;
21851 submit_info[0].waitSemaphoreCount = 0;
21852 submit_info[0].pWaitSemaphores = NULL;
21853 submit_info[0].pWaitDstStageMask = 0;
21854
21855 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21856 submit_info[1].pNext = NULL;
21857 submit_info[1].commandBufferCount = 1;
21858 submit_info[1].pCommandBuffers = &command_buffer[1];
21859 submit_info[1].waitSemaphoreCount = 1;
21860 submit_info[1].pWaitSemaphores = &semaphore;
21861 submit_info[1].pWaitDstStageMask = flags;
21862 submit_info[1].signalSemaphoreCount = 0;
21863 submit_info[1].pSignalSemaphores = NULL;
21864 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21865 }
21866
21867 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21868
21869 vkDestroyFence(m_device->device(), fence, nullptr);
21870 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21871 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21872 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21873
21874 m_errorMonitor->VerifyNotFound();
21875}
21876
21877TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21878 m_errorMonitor->ExpectSuccess();
21879
Tony Barbour1fa09702017-03-16 12:09:08 -060021880 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21882
Tony Barbour552f6c02016-12-21 14:34:07 -070021883 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021884
21885 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21886 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21887 m_errorMonitor->VerifyNotFound();
21888 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21889 m_errorMonitor->VerifyNotFound();
21890 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21891 m_errorMonitor->VerifyNotFound();
21892
21893 m_commandBuffer->EndCommandBuffer();
21894 m_errorMonitor->VerifyNotFound();
21895}
21896
21897TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021898 TEST_DESCRIPTION(
21899 "Positive test where we create a renderpass with an "
21900 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21901 "has a valid layout, and a second subpass then uses a "
21902 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021903 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021904 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021905 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021906 if (!depth_format) {
21907 printf(" No Depth + Stencil format found. Skipped.\n");
21908 return;
21909 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021910
21911 VkAttachmentReference attach[2] = {};
21912 attach[0].attachment = 0;
21913 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21914 attach[1].attachment = 0;
21915 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21916 VkSubpassDescription subpasses[2] = {};
21917 // First subpass clears DS attach on load
21918 subpasses[0].pDepthStencilAttachment = &attach[0];
21919 // 2nd subpass reads in DS as input attachment
21920 subpasses[1].inputAttachmentCount = 1;
21921 subpasses[1].pInputAttachments = &attach[1];
21922 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021923 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021924 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21925 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21926 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21927 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21928 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21929 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21930 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21931 VkRenderPassCreateInfo rpci = {};
21932 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21933 rpci.attachmentCount = 1;
21934 rpci.pAttachments = &attach_desc;
21935 rpci.subpassCount = 2;
21936 rpci.pSubpasses = subpasses;
21937
21938 // Now create RenderPass and verify no errors
21939 VkRenderPass rp;
21940 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21941 m_errorMonitor->VerifyNotFound();
21942
21943 vkDestroyRenderPass(m_device->device(), rp, NULL);
21944}
21945
Tobin Ehlis01103de2017-02-16 13:22:47 -070021946TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21947 TEST_DESCRIPTION(
21948 "Create a render pass with depth-stencil attachment where layout transition "
21949 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21950 "transition has correctly occurred at queue submit time with no validation errors.");
21951
Tony Barbour1fa09702017-03-16 12:09:08 -060021952 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021953 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021954 if (!depth_format) {
21955 printf(" No Depth + Stencil format found. Skipped.\n");
21956 return;
21957 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021958 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021959 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021960 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21961 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021962 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021963 return;
21964 }
21965
21966 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21968
21969 // A renderpass with one depth/stencil attachment.
21970 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021971 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021972 VK_SAMPLE_COUNT_1_BIT,
21973 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21974 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21975 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21976 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21977 VK_IMAGE_LAYOUT_UNDEFINED,
21978 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21979
21980 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21981
21982 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21983
21984 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21985
21986 VkRenderPass rp;
21987 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21988 ASSERT_VK_SUCCESS(err);
21989 // A compatible ds image.
21990 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021991 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 -070021992 ASSERT_TRUE(image.initialized());
21993
21994 VkImageViewCreateInfo ivci = {
21995 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21996 nullptr,
21997 0,
21998 image.handle(),
21999 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022000 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022001 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22002 VK_COMPONENT_SWIZZLE_IDENTITY},
22003 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22004 };
22005 VkImageView view;
22006 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22007 ASSERT_VK_SUCCESS(err);
22008
22009 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22010 VkFramebuffer fb;
22011 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22012 ASSERT_VK_SUCCESS(err);
22013
22014 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22015 m_commandBuffer->BeginCommandBuffer();
22016 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22017 vkCmdEndRenderPass(m_commandBuffer->handle());
22018 m_commandBuffer->EndCommandBuffer();
22019 QueueCommandBuffer(false);
22020 m_errorMonitor->VerifyNotFound();
22021
22022 // Cleanup
22023 vkDestroyImageView(m_device->device(), view, NULL);
22024 vkDestroyRenderPass(m_device->device(), rp, NULL);
22025 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22026}
22027
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022028TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022029 TEST_DESCRIPTION(
22030 "Test that pipeline validation accepts matrices passed "
22031 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022032 m_errorMonitor->ExpectSuccess();
22033
Tony Barbour1fa09702017-03-16 12:09:08 -060022034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22036
22037 VkVertexInputBindingDescription input_binding;
22038 memset(&input_binding, 0, sizeof(input_binding));
22039
22040 VkVertexInputAttributeDescription input_attribs[2];
22041 memset(input_attribs, 0, sizeof(input_attribs));
22042
22043 for (int i = 0; i < 2; i++) {
22044 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22045 input_attribs[i].location = i;
22046 }
22047
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022048 char const *vsSource =
22049 "#version 450\n"
22050 "\n"
22051 "layout(location=0) in mat2x4 x;\n"
22052 "out gl_PerVertex {\n"
22053 " vec4 gl_Position;\n"
22054 "};\n"
22055 "void main(){\n"
22056 " gl_Position = x[0] + x[1];\n"
22057 "}\n";
22058 char const *fsSource =
22059 "#version 450\n"
22060 "\n"
22061 "layout(location=0) out vec4 color;\n"
22062 "void main(){\n"
22063 " color = vec4(1);\n"
22064 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022065
22066 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22067 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22068
22069 VkPipelineObj pipe(m_device);
22070 pipe.AddColorAttachment();
22071 pipe.AddShader(&vs);
22072 pipe.AddShader(&fs);
22073
22074 pipe.AddVertexInputBindings(&input_binding, 1);
22075 pipe.AddVertexInputAttribs(input_attribs, 2);
22076
22077 VkDescriptorSetObj descriptorSet(m_device);
22078 descriptorSet.AppendDummy();
22079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22080
22081 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22082
22083 /* expect success */
22084 m_errorMonitor->VerifyNotFound();
22085}
22086
22087TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22088 m_errorMonitor->ExpectSuccess();
22089
Tony Barbour1fa09702017-03-16 12:09:08 -060022090 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22092
22093 VkVertexInputBindingDescription input_binding;
22094 memset(&input_binding, 0, sizeof(input_binding));
22095
22096 VkVertexInputAttributeDescription input_attribs[2];
22097 memset(input_attribs, 0, sizeof(input_attribs));
22098
22099 for (int i = 0; i < 2; i++) {
22100 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22101 input_attribs[i].location = i;
22102 }
22103
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022104 char const *vsSource =
22105 "#version 450\n"
22106 "\n"
22107 "layout(location=0) in vec4 x[2];\n"
22108 "out gl_PerVertex {\n"
22109 " vec4 gl_Position;\n"
22110 "};\n"
22111 "void main(){\n"
22112 " gl_Position = x[0] + x[1];\n"
22113 "}\n";
22114 char const *fsSource =
22115 "#version 450\n"
22116 "\n"
22117 "layout(location=0) out vec4 color;\n"
22118 "void main(){\n"
22119 " color = vec4(1);\n"
22120 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022121
22122 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22123 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22124
22125 VkPipelineObj pipe(m_device);
22126 pipe.AddColorAttachment();
22127 pipe.AddShader(&vs);
22128 pipe.AddShader(&fs);
22129
22130 pipe.AddVertexInputBindings(&input_binding, 1);
22131 pipe.AddVertexInputAttribs(input_attribs, 2);
22132
22133 VkDescriptorSetObj descriptorSet(m_device);
22134 descriptorSet.AppendDummy();
22135 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22136
22137 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22138
22139 m_errorMonitor->VerifyNotFound();
22140}
22141
22142TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022143 TEST_DESCRIPTION(
22144 "Test that pipeline validation accepts consuming a vertex attribute "
22145 "through multiple vertex shader inputs, each consuming a different "
22146 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022147 m_errorMonitor->ExpectSuccess();
22148
Tony Barbour1fa09702017-03-16 12:09:08 -060022149 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22151
22152 VkVertexInputBindingDescription input_binding;
22153 memset(&input_binding, 0, sizeof(input_binding));
22154
22155 VkVertexInputAttributeDescription input_attribs[3];
22156 memset(input_attribs, 0, sizeof(input_attribs));
22157
22158 for (int i = 0; i < 3; i++) {
22159 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22160 input_attribs[i].location = i;
22161 }
22162
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022163 char const *vsSource =
22164 "#version 450\n"
22165 "\n"
22166 "layout(location=0) in vec4 x;\n"
22167 "layout(location=1) in vec3 y1;\n"
22168 "layout(location=1, component=3) in float y2;\n"
22169 "layout(location=2) in vec4 z;\n"
22170 "out gl_PerVertex {\n"
22171 " vec4 gl_Position;\n"
22172 "};\n"
22173 "void main(){\n"
22174 " gl_Position = x + vec4(y1, y2) + z;\n"
22175 "}\n";
22176 char const *fsSource =
22177 "#version 450\n"
22178 "\n"
22179 "layout(location=0) out vec4 color;\n"
22180 "void main(){\n"
22181 " color = vec4(1);\n"
22182 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022183
22184 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22185 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22186
22187 VkPipelineObj pipe(m_device);
22188 pipe.AddColorAttachment();
22189 pipe.AddShader(&vs);
22190 pipe.AddShader(&fs);
22191
22192 pipe.AddVertexInputBindings(&input_binding, 1);
22193 pipe.AddVertexInputAttribs(input_attribs, 3);
22194
22195 VkDescriptorSetObj descriptorSet(m_device);
22196 descriptorSet.AppendDummy();
22197 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22198
22199 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22200
22201 m_errorMonitor->VerifyNotFound();
22202}
22203
22204TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22205 m_errorMonitor->ExpectSuccess();
22206
Tony Barbour1fa09702017-03-16 12:09:08 -060022207 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22209
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022210 char const *vsSource =
22211 "#version 450\n"
22212 "out gl_PerVertex {\n"
22213 " vec4 gl_Position;\n"
22214 "};\n"
22215 "void main(){\n"
22216 " gl_Position = vec4(0);\n"
22217 "}\n";
22218 char const *fsSource =
22219 "#version 450\n"
22220 "\n"
22221 "layout(location=0) out vec4 color;\n"
22222 "void main(){\n"
22223 " color = vec4(1);\n"
22224 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022225
22226 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22228
22229 VkPipelineObj pipe(m_device);
22230 pipe.AddColorAttachment();
22231 pipe.AddShader(&vs);
22232 pipe.AddShader(&fs);
22233
22234 VkDescriptorSetObj descriptorSet(m_device);
22235 descriptorSet.AppendDummy();
22236 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22237
22238 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22239
22240 m_errorMonitor->VerifyNotFound();
22241}
22242
22243TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022244 TEST_DESCRIPTION(
22245 "Test that pipeline validation accepts the relaxed type matching rules "
22246 "set out in 14.1.3: fundamental type must match, and producer side must "
22247 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022248 m_errorMonitor->ExpectSuccess();
22249
22250 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22251
Tony Barbour1fa09702017-03-16 12:09:08 -060022252 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22254
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022255 char const *vsSource =
22256 "#version 450\n"
22257 "out gl_PerVertex {\n"
22258 " vec4 gl_Position;\n"
22259 "};\n"
22260 "layout(location=0) out vec3 x;\n"
22261 "layout(location=1) out ivec3 y;\n"
22262 "layout(location=2) out vec3 z;\n"
22263 "void main(){\n"
22264 " gl_Position = vec4(0);\n"
22265 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22266 "}\n";
22267 char const *fsSource =
22268 "#version 450\n"
22269 "\n"
22270 "layout(location=0) out vec4 color;\n"
22271 "layout(location=0) in float x;\n"
22272 "layout(location=1) flat in int y;\n"
22273 "layout(location=2) in vec2 z;\n"
22274 "void main(){\n"
22275 " color = vec4(1 + x + y + z.x);\n"
22276 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022277
22278 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22279 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22280
22281 VkPipelineObj pipe(m_device);
22282 pipe.AddColorAttachment();
22283 pipe.AddShader(&vs);
22284 pipe.AddShader(&fs);
22285
22286 VkDescriptorSetObj descriptorSet(m_device);
22287 descriptorSet.AppendDummy();
22288 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22289
22290 VkResult err = VK_SUCCESS;
22291 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22292 ASSERT_VK_SUCCESS(err);
22293
22294 m_errorMonitor->VerifyNotFound();
22295}
22296
22297TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022298 TEST_DESCRIPTION(
22299 "Test that pipeline validation accepts per-vertex variables "
22300 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022301 m_errorMonitor->ExpectSuccess();
22302
Tony Barbour1fa09702017-03-16 12:09:08 -060022303 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22305
22306 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022307 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022308 return;
22309 }
22310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022311 char const *vsSource =
22312 "#version 450\n"
22313 "void main(){}\n";
22314 char const *tcsSource =
22315 "#version 450\n"
22316 "layout(location=0) out int x[];\n"
22317 "layout(vertices=3) out;\n"
22318 "void main(){\n"
22319 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22320 " gl_TessLevelInner[0] = 1;\n"
22321 " x[gl_InvocationID] = gl_InvocationID;\n"
22322 "}\n";
22323 char const *tesSource =
22324 "#version 450\n"
22325 "layout(triangles, equal_spacing, cw) in;\n"
22326 "layout(location=0) in int x[];\n"
22327 "out gl_PerVertex { vec4 gl_Position; };\n"
22328 "void main(){\n"
22329 " gl_Position.xyz = gl_TessCoord;\n"
22330 " gl_Position.w = x[0] + x[1] + x[2];\n"
22331 "}\n";
22332 char const *fsSource =
22333 "#version 450\n"
22334 "layout(location=0) out vec4 color;\n"
22335 "void main(){\n"
22336 " color = vec4(1);\n"
22337 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022338
22339 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22340 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22341 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22342 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22343
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022344 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22345 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022346
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022347 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022348
22349 VkPipelineObj pipe(m_device);
22350 pipe.SetInputAssembly(&iasci);
22351 pipe.SetTessellation(&tsci);
22352 pipe.AddColorAttachment();
22353 pipe.AddShader(&vs);
22354 pipe.AddShader(&tcs);
22355 pipe.AddShader(&tes);
22356 pipe.AddShader(&fs);
22357
22358 VkDescriptorSetObj descriptorSet(m_device);
22359 descriptorSet.AppendDummy();
22360 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22361
22362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22363
22364 m_errorMonitor->VerifyNotFound();
22365}
22366
22367TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022368 TEST_DESCRIPTION(
22369 "Test that pipeline validation accepts a user-defined "
22370 "interface block passed into the geometry shader. This "
22371 "is interesting because the 'extra' array level is not "
22372 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022373 m_errorMonitor->ExpectSuccess();
22374
Tony Barbour1fa09702017-03-16 12:09:08 -060022375 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22377
22378 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022379 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 return;
22381 }
22382
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022383 char const *vsSource =
22384 "#version 450\n"
22385 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22386 "void main(){\n"
22387 " vs_out.x = vec4(1);\n"
22388 "}\n";
22389 char const *gsSource =
22390 "#version 450\n"
22391 "layout(triangles) in;\n"
22392 "layout(triangle_strip, max_vertices=3) out;\n"
22393 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22394 "out gl_PerVertex { vec4 gl_Position; };\n"
22395 "void main() {\n"
22396 " gl_Position = gs_in[0].x;\n"
22397 " EmitVertex();\n"
22398 "}\n";
22399 char const *fsSource =
22400 "#version 450\n"
22401 "layout(location=0) out vec4 color;\n"
22402 "void main(){\n"
22403 " color = vec4(1);\n"
22404 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022405
22406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22407 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22408 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22409
22410 VkPipelineObj pipe(m_device);
22411 pipe.AddColorAttachment();
22412 pipe.AddShader(&vs);
22413 pipe.AddShader(&gs);
22414 pipe.AddShader(&fs);
22415
22416 VkDescriptorSetObj descriptorSet(m_device);
22417 descriptorSet.AppendDummy();
22418 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22419
22420 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22421
22422 m_errorMonitor->VerifyNotFound();
22423}
22424
22425TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022426 TEST_DESCRIPTION(
22427 "Test that pipeline validation accepts basic use of 64bit vertex "
22428 "attributes. This is interesting because they consume multiple "
22429 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022430 m_errorMonitor->ExpectSuccess();
22431
Tony Barbour1fa09702017-03-16 12:09:08 -060022432 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22434
22435 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022436 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022437 return;
22438 }
22439
22440 VkVertexInputBindingDescription input_bindings[1];
22441 memset(input_bindings, 0, sizeof(input_bindings));
22442
22443 VkVertexInputAttributeDescription input_attribs[4];
22444 memset(input_attribs, 0, sizeof(input_attribs));
22445 input_attribs[0].location = 0;
22446 input_attribs[0].offset = 0;
22447 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22448 input_attribs[1].location = 2;
22449 input_attribs[1].offset = 32;
22450 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22451 input_attribs[2].location = 4;
22452 input_attribs[2].offset = 64;
22453 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22454 input_attribs[3].location = 6;
22455 input_attribs[3].offset = 96;
22456 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22457
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022458 char const *vsSource =
22459 "#version 450\n"
22460 "\n"
22461 "layout(location=0) in dmat4 x;\n"
22462 "out gl_PerVertex {\n"
22463 " vec4 gl_Position;\n"
22464 "};\n"
22465 "void main(){\n"
22466 " gl_Position = vec4(x[0][0]);\n"
22467 "}\n";
22468 char const *fsSource =
22469 "#version 450\n"
22470 "\n"
22471 "layout(location=0) out vec4 color;\n"
22472 "void main(){\n"
22473 " color = vec4(1);\n"
22474 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022475
22476 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22477 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22478
22479 VkPipelineObj pipe(m_device);
22480 pipe.AddColorAttachment();
22481 pipe.AddShader(&vs);
22482 pipe.AddShader(&fs);
22483
22484 pipe.AddVertexInputBindings(input_bindings, 1);
22485 pipe.AddVertexInputAttribs(input_attribs, 4);
22486
22487 VkDescriptorSetObj descriptorSet(m_device);
22488 descriptorSet.AppendDummy();
22489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22490
22491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22492
22493 m_errorMonitor->VerifyNotFound();
22494}
22495
22496TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22497 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22498 m_errorMonitor->ExpectSuccess();
22499
Tony Barbour1fa09702017-03-16 12:09:08 -060022500 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022502 char const *vsSource =
22503 "#version 450\n"
22504 "\n"
22505 "out gl_PerVertex {\n"
22506 " vec4 gl_Position;\n"
22507 "};\n"
22508 "void main(){\n"
22509 " gl_Position = vec4(1);\n"
22510 "}\n";
22511 char const *fsSource =
22512 "#version 450\n"
22513 "\n"
22514 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22515 "layout(location=0) out vec4 color;\n"
22516 "void main() {\n"
22517 " color = subpassLoad(x);\n"
22518 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022519
22520 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22521 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22522
22523 VkPipelineObj pipe(m_device);
22524 pipe.AddShader(&vs);
22525 pipe.AddShader(&fs);
22526 pipe.AddColorAttachment();
22527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22528
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022529 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22530 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022531 VkDescriptorSetLayout dsl;
22532 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22533 ASSERT_VK_SUCCESS(err);
22534
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022535 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022536 VkPipelineLayout pl;
22537 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22538 ASSERT_VK_SUCCESS(err);
22539
22540 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022541 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22542 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22543 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22544 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22545 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 -060022546 };
22547 VkAttachmentReference color = {
22548 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22549 };
22550 VkAttachmentReference input = {
22551 1, VK_IMAGE_LAYOUT_GENERAL,
22552 };
22553
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022554 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022555
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022556 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022557 VkRenderPass rp;
22558 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22559 ASSERT_VK_SUCCESS(err);
22560
22561 // should be OK. would go wrong here if it's going to...
22562 pipe.CreateVKPipeline(pl, rp);
22563
22564 m_errorMonitor->VerifyNotFound();
22565
22566 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22568 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22569}
22570
22571TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022572 TEST_DESCRIPTION(
22573 "Test that pipeline validation accepts a compute pipeline which declares a "
22574 "descriptor-backed resource which is not provided, but the shader does not "
22575 "statically use it. This is interesting because it requires compute pipelines "
22576 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022577 m_errorMonitor->ExpectSuccess();
22578
Tony Barbour1fa09702017-03-16 12:09:08 -060022579 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022580
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022581 char const *csSource =
22582 "#version 450\n"
22583 "\n"
22584 "layout(local_size_x=1) in;\n"
22585 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22586 "void main(){\n"
22587 " // x is not used.\n"
22588 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022589
22590 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22591
22592 VkDescriptorSetObj descriptorSet(m_device);
22593 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22594
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022595 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22596 nullptr,
22597 0,
22598 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22599 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22600 descriptorSet.GetPipelineLayout(),
22601 VK_NULL_HANDLE,
22602 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603
22604 VkPipeline pipe;
22605 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22606
22607 m_errorMonitor->VerifyNotFound();
22608
22609 if (err == VK_SUCCESS) {
22610 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22611 }
22612}
22613
22614TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022615 TEST_DESCRIPTION(
22616 "Test that pipeline validation accepts a shader consuming only the "
22617 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022618 m_errorMonitor->ExpectSuccess();
22619
Tony Barbour1fa09702017-03-16 12:09:08 -060022620 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022621
22622 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022623 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22624 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22625 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022626 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022627 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022628 VkDescriptorSetLayout dsl;
22629 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22630 ASSERT_VK_SUCCESS(err);
22631
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022632 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022633 VkPipelineLayout pl;
22634 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22635 ASSERT_VK_SUCCESS(err);
22636
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022637 char const *csSource =
22638 "#version 450\n"
22639 "\n"
22640 "layout(local_size_x=1) in;\n"
22641 "layout(set=0, binding=0) uniform sampler s;\n"
22642 "layout(set=0, binding=1) uniform texture2D t;\n"
22643 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22644 "void main() {\n"
22645 " x = texture(sampler2D(t, s), vec2(0));\n"
22646 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022647 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22648
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022649 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22650 nullptr,
22651 0,
22652 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22653 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22654 pl,
22655 VK_NULL_HANDLE,
22656 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022657
22658 VkPipeline pipe;
22659 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22660
22661 m_errorMonitor->VerifyNotFound();
22662
22663 if (err == VK_SUCCESS) {
22664 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22665 }
22666
22667 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22668 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22669}
22670
22671TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022672 TEST_DESCRIPTION(
22673 "Test that pipeline validation accepts a shader consuming only the "
22674 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022675 m_errorMonitor->ExpectSuccess();
22676
Tony Barbour1fa09702017-03-16 12:09:08 -060022677 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022678
22679 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022680 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22681 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22682 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022683 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022684 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022685 VkDescriptorSetLayout dsl;
22686 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22687 ASSERT_VK_SUCCESS(err);
22688
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022689 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022690 VkPipelineLayout pl;
22691 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22692 ASSERT_VK_SUCCESS(err);
22693
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022694 char const *csSource =
22695 "#version 450\n"
22696 "\n"
22697 "layout(local_size_x=1) in;\n"
22698 "layout(set=0, binding=0) uniform texture2D t;\n"
22699 "layout(set=0, binding=1) uniform sampler s;\n"
22700 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22701 "void main() {\n"
22702 " x = texture(sampler2D(t, s), vec2(0));\n"
22703 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022704 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22705
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022706 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22707 nullptr,
22708 0,
22709 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22710 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22711 pl,
22712 VK_NULL_HANDLE,
22713 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022714
22715 VkPipeline pipe;
22716 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22717
22718 m_errorMonitor->VerifyNotFound();
22719
22720 if (err == VK_SUCCESS) {
22721 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22722 }
22723
22724 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22725 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22726}
22727
22728TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022729 TEST_DESCRIPTION(
22730 "Test that pipeline validation accepts a shader consuming "
22731 "both the sampler and the image of a combined image+sampler "
22732 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022733 m_errorMonitor->ExpectSuccess();
22734
Tony Barbour1fa09702017-03-16 12:09:08 -060022735 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022736
22737 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022738 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22739 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022740 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022741 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022742 VkDescriptorSetLayout dsl;
22743 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22744 ASSERT_VK_SUCCESS(err);
22745
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022746 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022747 VkPipelineLayout pl;
22748 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22749 ASSERT_VK_SUCCESS(err);
22750
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022751 char const *csSource =
22752 "#version 450\n"
22753 "\n"
22754 "layout(local_size_x=1) in;\n"
22755 "layout(set=0, binding=0) uniform texture2D t;\n"
22756 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22757 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22758 "void main() {\n"
22759 " x = texture(sampler2D(t, s), vec2(0));\n"
22760 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022761 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22762
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022763 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22764 nullptr,
22765 0,
22766 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22767 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22768 pl,
22769 VK_NULL_HANDLE,
22770 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022771
22772 VkPipeline pipe;
22773 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22774
22775 m_errorMonitor->VerifyNotFound();
22776
22777 if (err == VK_SUCCESS) {
22778 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22779 }
22780
22781 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22782 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22783}
22784
Tony Barbour3ed87a02017-03-15 16:19:02 -060022785TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022786 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22787
Tony Barbour3ed87a02017-03-15 16:19:02 -060022788 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022789 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022790
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022791 // Ensure that extension is available and enabled.
22792 uint32_t extension_count = 0;
22793 bool supports_maintenance1_extension = false;
22794 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22795 ASSERT_VK_SUCCESS(err);
22796 if (extension_count > 0) {
22797 std::vector<VkExtensionProperties> available_extensions(extension_count);
22798
22799 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22800 ASSERT_VK_SUCCESS(err);
22801 for (const auto &extension_props : available_extensions) {
22802 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22803 supports_maintenance1_extension = true;
22804 }
22805 }
22806 }
22807
22808 // Proceed if extension is supported by hardware
22809 if (!supports_maintenance1_extension) {
22810 printf(" Maintenance1 Extension not supported, skipping tests\n");
22811 return;
22812 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022813
22814 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060022815 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022816 VkCommandBuffer cmd_buf;
22817 VkCommandBufferAllocateInfo alloc_info;
22818 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22819 alloc_info.pNext = NULL;
22820 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022821 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022822 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22823 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22824
22825 VkCommandBufferBeginInfo cb_binfo;
22826 cb_binfo.pNext = NULL;
22827 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22828 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22829 cb_binfo.flags = 0;
22830 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22831 // Set Negative height, should give error if Maintenance 1 is not enabled
22832 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22833 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22834 vkEndCommandBuffer(cmd_buf);
22835
22836 m_errorMonitor->VerifyNotFound();
22837}
22838
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022839TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22840 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22841
22842 ASSERT_NO_FATAL_FAILURE(Init());
22843
22844 uint32_t extension_count = 0;
22845 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22846 ASSERT_VK_SUCCESS(err);
22847
22848 if (extension_count > 0) {
22849 std::vector<VkExtensionProperties> available_extensions(extension_count);
22850 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22851 ASSERT_VK_SUCCESS(err);
22852
22853 for (const auto &extension_props : available_extensions) {
22854 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22855 // Create two pNext structures which by themselves would be valid
22856 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22857 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22858 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22859 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22860 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22861
22862 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22863 dedicated_buffer_create_info_2.pNext = nullptr;
22864 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22865
22866 uint32_t queue_family_index = 0;
22867 VkBufferCreateInfo buffer_create_info = {};
22868 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22869 buffer_create_info.pNext = &dedicated_buffer_create_info;
22870 buffer_create_info.size = 1024;
22871 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22872 buffer_create_info.queueFamilyIndexCount = 1;
22873 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22874
22875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22876 VkBuffer buffer;
22877 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22878 m_errorMonitor->VerifyFound();
22879 }
22880 }
22881 }
22882}
22883
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022884TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22885 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22886
Tony Barbour1fa09702017-03-16 12:09:08 -060022887 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022888
22889 // Positive test to check parameter_validation and unique_objects support
22890 // for NV_dedicated_allocation
22891 uint32_t extension_count = 0;
22892 bool supports_nv_dedicated_allocation = false;
22893 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22894 ASSERT_VK_SUCCESS(err);
22895
22896 if (extension_count > 0) {
22897 std::vector<VkExtensionProperties> available_extensions(extension_count);
22898
22899 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22900 ASSERT_VK_SUCCESS(err);
22901
22902 for (const auto &extension_props : available_extensions) {
22903 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22904 supports_nv_dedicated_allocation = true;
22905 }
22906 }
22907 }
22908
22909 if (supports_nv_dedicated_allocation) {
22910 m_errorMonitor->ExpectSuccess();
22911
22912 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22913 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22914 dedicated_buffer_create_info.pNext = nullptr;
22915 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22916
22917 uint32_t queue_family_index = 0;
22918 VkBufferCreateInfo buffer_create_info = {};
22919 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22920 buffer_create_info.pNext = &dedicated_buffer_create_info;
22921 buffer_create_info.size = 1024;
22922 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22923 buffer_create_info.queueFamilyIndexCount = 1;
22924 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22925
22926 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022927 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928 ASSERT_VK_SUCCESS(err);
22929
22930 VkMemoryRequirements memory_reqs;
22931 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22932
22933 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22934 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22935 dedicated_memory_info.pNext = nullptr;
22936 dedicated_memory_info.buffer = buffer;
22937 dedicated_memory_info.image = VK_NULL_HANDLE;
22938
22939 VkMemoryAllocateInfo memory_info = {};
22940 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22941 memory_info.pNext = &dedicated_memory_info;
22942 memory_info.allocationSize = memory_reqs.size;
22943
22944 bool pass;
22945 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22946 ASSERT_TRUE(pass);
22947
22948 VkDeviceMemory buffer_memory;
22949 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22950 ASSERT_VK_SUCCESS(err);
22951
22952 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22953 ASSERT_VK_SUCCESS(err);
22954
22955 vkDestroyBuffer(m_device->device(), buffer, NULL);
22956 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22957
22958 m_errorMonitor->VerifyNotFound();
22959 }
22960}
22961
22962TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22963 VkResult err;
22964
22965 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22966
Tony Barbour1fa09702017-03-16 12:09:08 -060022967 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22969
22970 std::vector<const char *> device_extension_names;
22971 auto features = m_device->phy().features();
22972 // Artificially disable support for non-solid fill modes
22973 features.fillModeNonSolid = false;
22974 // The sacrificial device object
22975 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22976
22977 VkRenderpassObj render_pass(&test_device);
22978
22979 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22980 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22981 pipeline_layout_ci.setLayoutCount = 0;
22982 pipeline_layout_ci.pSetLayouts = NULL;
22983
22984 VkPipelineLayout pipeline_layout;
22985 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22986 ASSERT_VK_SUCCESS(err);
22987
22988 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22989 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22990 rs_ci.pNext = nullptr;
22991 rs_ci.lineWidth = 1.0f;
22992 rs_ci.rasterizerDiscardEnable = true;
22993
22994 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22995 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22996
22997 // Set polygonMode=FILL. No error is expected
22998 m_errorMonitor->ExpectSuccess();
22999 {
23000 VkPipelineObj pipe(&test_device);
23001 pipe.AddShader(&vs);
23002 pipe.AddShader(&fs);
23003 pipe.AddColorAttachment();
23004 // Set polygonMode to a good value
23005 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23006 pipe.SetRasterization(&rs_ci);
23007 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23008 }
23009 m_errorMonitor->VerifyNotFound();
23010
23011 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23012}
23013
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023014#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023015TEST_F(VkPositiveLayerTest, LongFenceChain)
23016{
23017 m_errorMonitor->ExpectSuccess();
23018
Tony Barbour1fa09702017-03-16 12:09:08 -060023019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023020 VkResult err;
23021
23022 std::vector<VkFence> fences;
23023
23024 const int chainLength = 32768;
23025
23026 for (int i = 0; i < chainLength; i++) {
23027 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23028 VkFence fence;
23029 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23030 ASSERT_VK_SUCCESS(err);
23031
23032 fences.push_back(fence);
23033
23034 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23035 0, nullptr, 0, nullptr };
23036 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23037 ASSERT_VK_SUCCESS(err);
23038
23039 }
23040
23041 // BOOM, stack overflow.
23042 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23043
23044 for (auto fence : fences)
23045 vkDestroyFence(m_device->device(), fence, nullptr);
23046
23047 m_errorMonitor->VerifyNotFound();
23048}
23049#endif
23050
Cody Northrop1242dfd2016-07-13 17:24:59 -060023051#if defined(ANDROID) && defined(VALIDATION_APK)
23052static bool initialized = false;
23053static bool active = false;
23054
23055// Convert Intents to argv
23056// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023057std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023058 std::vector<std::string> args;
23059 JavaVM &vm = *app.activity->vm;
23060 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023061 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023062
23063 JNIEnv &env = *p_env;
23064 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023065 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023066 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023067 jmethodID get_string_extra_method =
23068 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023069 jvalue get_string_extra_args;
23070 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023071 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023072
23073 std::string args_str;
23074 if (extra_str) {
23075 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23076 args_str = extra_utf;
23077 env.ReleaseStringUTFChars(extra_str, extra_utf);
23078 env.DeleteLocalRef(extra_str);
23079 }
23080
23081 env.DeleteLocalRef(get_string_extra_args.l);
23082 env.DeleteLocalRef(intent);
23083 vm.DetachCurrentThread();
23084
23085 // split args_str
23086 std::stringstream ss(args_str);
23087 std::string arg;
23088 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023089 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023090 }
23091
23092 return args;
23093}
23094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023095static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023097static void processCommand(struct android_app *app, int32_t cmd) {
23098 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023099 case APP_CMD_INIT_WINDOW: {
23100 if (app->window) {
23101 initialized = true;
23102 }
23103 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023104 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023105 case APP_CMD_GAINED_FOCUS: {
23106 active = true;
23107 break;
23108 }
23109 case APP_CMD_LOST_FOCUS: {
23110 active = false;
23111 break;
23112 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023113 }
23114}
23115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023116void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023117 app_dummy();
23118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023119 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023120
23121 int vulkanSupport = InitVulkan();
23122 if (vulkanSupport == 0) {
23123 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23124 return;
23125 }
23126
23127 app->onAppCmd = processCommand;
23128 app->onInputEvent = processInput;
23129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023130 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023131 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023132 struct android_poll_source *source;
23133 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023134 if (source) {
23135 source->process(app, source);
23136 }
23137
23138 if (app->destroyRequested != 0) {
23139 VkTestFramework::Finish();
23140 return;
23141 }
23142 }
23143
23144 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023145 // Use the following key to send arguments to gtest, i.e.
23146 // --es args "--gtest_filter=-VkLayerTest.foo"
23147 const char key[] = "args";
23148 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023149
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023150 std::string filter = "";
23151 if (args.size() > 0) {
23152 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23153 filter += args[0];
23154 } else {
23155 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23156 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023157
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023158 int argc = 2;
23159 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23160 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023161
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023162 // Route output to files until we can override the gtest output
23163 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23164 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023166 ::testing::InitGoogleTest(&argc, argv);
23167 VkTestFramework::InitArgs(&argc, argv);
23168 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023170 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023172 if (result != 0) {
23173 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23174 } else {
23175 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23176 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023177
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023178 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023180 fclose(stdout);
23181 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023183 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023184 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023185 }
23186 }
23187}
23188#endif
23189
Tony Barbour300a6082015-04-07 13:44:53 -060023190int main(int argc, char **argv) {
23191 int result;
23192
Cody Northrop8e54a402016-03-08 22:25:52 -070023193#ifdef ANDROID
23194 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023195 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023196#endif
23197
Tony Barbour300a6082015-04-07 13:44:53 -060023198 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023199 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023200
23201 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23202
23203 result = RUN_ALL_TESTS();
23204
Tony Barbour6918cd52015-04-09 12:58:51 -060023205 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023206 return result;
23207}